角色移动代码参考如下:
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();
}
}
}