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

该代码示例展示了在Unity3D中如何处理角色移动和鼠标事件,包括角色在地面上的行走、旋转以及对地面的点击检测。MouseHit类用于处理鼠标点击地面的事件,MouseOperation类处理鼠标点击和拖拽操作,CharacterMove类则实现了角色的移动控制。
摘要由CSDN通过智能技术生成

角色移动代码参考如下:

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();
		}
	}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值