通过鼠标左键控制角色在场景中的移动步骤:
1.鼠标点击屏幕,用射线获取移动目标位置
2.角色转身朝向目标,并移动到目标位置
/// <summary>
/// 移动的目标点
/// </summary>
private Vector3 m_TargetPos = Vector3.zero;
/// <summary>
/// 角色控制器
/// </summary>
private CharacterController m_CharacterController;
/// <summary>
/// 移动速度
/// </summary>
[SerializeField]
private float m_Speed = 10f;
/// <summary>
/// 转身速度
/// </summary>
[SerializeField]
private float m_RotationSpeed = 0.2f;
/// <summary>
/// 转身的目标方向
/// </summary>
private Quaternion m_TargetQuaternion;
void Start ()
{
m_CharacterController = GetComponent<CharacterController>();
}
void Update()
{
//防止角色控制器找不到出bug,进行判断
if (!m_CharacterController) return;
#region 点击屏幕使角色移动 #region 点击屏幕使角色移动
//点击屏幕,得到目标点位置
if (Input.GetMouseButtonUp(0))
{
//Debug.Log("检测到鼠标点击屏幕");
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo))
{
//发射射线,找到地面
if (hitInfo.collider.gameObject.name.Equals("Ground"))
{
m_TargetPos = hitInfo.point;
Debug.DrawLine(Camera.main.transform.position, m_TargetPos);
}
}
m_RotationSpeed = 0f;
}
//让角色贴着地面
if (!m_CharacterController.isGrounded)
{
m_CharacterController.Move(new Vector3(0,-1000,0)*Time.deltaTime);
}
//如果目标点不是原点,进行移动
if (m_TargetPos != Vector3.zero)
{
//Debug.DrawLine(Camera.main.transform.position, m_TargetPos);
if (Vector3.Distance(transform.position, m_TargetPos) > 0.1f)
{
Vector3 diretion = m_TargetPos - transform.position;
diretion = diretion.normalized; //归一化
diretion.y = 0;
//转向目标方向
//transform.LookAt(new Vector3(m_TargetPos.x,transform.transform.position.y,m_TargetPos.z));
//让角色转身动作更加流畅
if (m_RotationSpeed<=1f)
{
m_RotationSpeed += 5f*Time.deltaTime;
m_TargetQuaternion = Quaternion.LookRotation(diretion);
transform.rotation = Quaternion.Lerp(transform.rotation, m_TargetQuaternion, m_RotationSpeed);
}
m_CharacterController.Move(diretion * m_Speed * Time.deltaTime);
}
}
#endregion
}