Unity角色键盘移动与鼠标点击移动协同方法

角色移动代码参考如下:

using UnityEngine;

public class CharacterMove : MonoBehaviour
{
	public CharacterController character;

	void Start()
	{
		targetPosition = transform.position;
		//
		MouseHit.instance.onHit += OnHit;
	}

	public float movSpeed = 5;
	public float rotSpeed = 60;
	void Update()
	{
		Move();
	}

	Vector3 targetPosition;
	void OnHit(RaycastHit hit)
	{
		if (hit.collider.gameObject.layer == LayerMask.NameToLayer("Ground"))
		{
			targetPosition = hit.point;
		}
	}

	float upSpeed = 0;
	Vector3 motion = Vector3.zero;
	void Move()
	{
		if (character.isGrounded)
		{
			if (Input.GetKey(KeyCode.A))
			{
				transform.Rotate(Vector3.up * rotSpeed * Time.deltaTime);
				targetPosition = transform.position;
			}

			if (Input.GetKey(KeyCode.D))
			{
				transform.Rotate(-Vector3.up * rotSpeed * Time.deltaTime);
				targetPosition = transform.position;
			}

			motion = Vector3.zero;

			if (Input.GetKey(KeyCode.W))
			{
				motion += transform.forward;
				targetPosition = transform.position;
			}

			if (Input.GetKey(KeyCode.S))
			{
				motion -= transform.forward;
				targetPosition = transform.position;
			}

			Vector3 targetToCharacter = targetPosition - transform.position;
			targetToCharacter.y = 0;
			if (targetToCharacter.sqrMagnitude > 0.25f)
			{
				targetToCharacter = targetToCharacter.normalized;
				transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(targetToCharacter, Vector3.up), Time.deltaTime * 5);
				motion += targetToCharacter;
			}

			motion *= movSpeed;

			if (Input.GetKeyDown(KeyCode.Space))
			{
				upSpeed = 2;
			}
		}

		upSpeed -= 9.8f * Time.deltaTime;
		if (upSpeed < -15) upSpeed = -15;

		motion += Vector3.up * upSpeed;

		character.Move(motion * Time.deltaTime);
	}
}

用于产生鼠标事件的代码参考如下:

using UnityEngine;
using UnityEngine.Events;

public class MouseOperation : MonoBehaviour
{
	static public MouseOperation instance;

	void Awake()
	{
		instance = this;
	}

	bool isDrag = false;
	bool clickEnabled = false;
	Vector3 posMouseDown;

	public UnityAction<Vector3> onClick;
	public UnityAction<Vector3> onDrag; 
	public UnityAction<Vector3> onRelease;
	public UnityAction<float> onZoom;

	Vector3 posMousePre;

	void Update()
	{
		if (Input.GetMouseButtonDown(0))
		{
			if (!UITool.instance.pointerOnUI)
			{
				isDrag = true;
				clickEnabled = true;
				posMouseDown = Input.mousePosition;
				posMousePre = posMouseDown;
			}
		}


		if (Input.GetMouseButtonUp(0))
		{
			isDrag = false;
			if (clickEnabled)
			{
				//产生一个点击事件
				onClick?.Invoke(Input.mousePosition);
			}
		}


		if (isDrag)
		{
			if ((Input.mousePosition - posMouseDown).sqrMagnitude > 9)
			{
				clickEnabled = false;
			}

			if (!clickEnabled)
			{
				//产生一个拖拽事件
				Vector3 deltaPos = Input.mousePosition - posMousePre;
				posMousePre = Input.mousePosition;

				onDrag?.Invoke(deltaPos);
			}
		}
		else
		{
			onRelease?.Invoke(Input.mousePosition);
		}

		float scroll = Input.GetAxis("Mouse ScrollWheel");
		if(!Mathf.Approximately(scroll,0))
		{
			if (!UITool.instance.pointerOnUI)
			{
				onZoom?.Invoke(scroll);
			}
		}
	}
}

用于产生鼠标点击地面事件的代码参考如下:

using UnityEngine;
using UnityEngine.Events;

public class MouseHit : MonoBehaviour
{
	static public MouseHit instance;

	void Awake()
	{
		instance = this;	
	}

	public UnityAction<RaycastHit> onHit;
	public UnityAction onHitEmpty;

    void Start()
    {
        MouseOperation.instance.onClick += OnHit;
    }

    void OnHit(Vector3 mousePosition)
	{
		Ray ray = Camera.main.ScreenPointToRay(mousePosition);
		RaycastHit hit;
		if (Physics.Raycast(ray, out hit))
		{
			onHit?.Invoke(hit);
		}
		else
		{
			onHitEmpty?.Invoke();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/ttod/article/details/129839997