角色看向鼠标方向
角色保持世界坐标移动
角色八方向移动动画
idle ,走路,跑步,冲刺切换
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Game
{
public class CharacterController : MonoBehaviour
{
float inputX;
float inputY;
Vector2 centerScreenPos;
[Tooltip("加速度")]
public float vel_Speed=10f;
Transform mTransfrom;
public float rotateSpeed = 1000;
private static int VEL_X = Animator.StringToHash("VelX");
private static int VEL_Z = Animator.StringToHash("VelZ");
Animator Animator;
public enum moveType
{
walk,
run,
sprint,
}
public moveType currentMoveType = moveType.walk;
private void Awake()
{
Animator = GetComponent<Animator>();
centerScreenPos = new Vector2(Screen.width / 2.0f, Screen.height / 2.0f);
mTransfrom = transform;
}
private void Update()
{
inputX = Input.GetAxis("Horizontal");
inputY = Input.GetAxis("Vertical");
Locomotion();
}
private void Locomotion()
{
//角色朝向鼠标
Vector2 mousePos = Input.mousePosition;
Vector2 dir = mousePos - centerScreenPos;
//计算角度
float angle = VectorAngle(dir, Vector2.up);
//Quaternion targetQua = Quaternion.LookRotation(new Vector3(dir.x, 0, dir.y));
//mTransfrom.rotation = Quaternion.RotateTowards(mTransfrom.rotation, targetQua, 1000 * Time.deltaTime);
float moveX = 0;
float moveZ = 0;
float targerAngle = 0;
float moveSpeed = 0.5f;//walk
switch (currentMoveType)
{
case moveType.walk:
break;
case moveType.run:
moveSpeed = 0.8f;
break;
case moveType.sprint:
moveSpeed = 1f;
break;
default:
break;
}
#region 方向判断
if (angle > -22.5 && angle <= 22.5)
{
//1
targerAngle = 0;
moveX = inputX == 0 ? 0 : inputX > 0 ? moveSpeed : -moveSpeed;
moveZ = inputY == 0 ? 0 : inputY > 0 ? moveSpeed : -moveSpeed;
}
else if (angle > 22.5 && angle <= 67.5)
{
#region 右上
//2
targerAngle = 45;
if (inputX == 0 && inputY == 0)
{
//idle
moveX = 0;
moveZ = 0;
}
else if (inputX == 0 && inputY > 0)
{
//前移
moveX = -moveSpeed;
moveZ = moveSpeed;
}
else if (inputX == 0 && inputY < 0)
{
//后退
moveX = moveSpeed;
moveZ = -moveSpeed;
}
else if (inputX > 0 && inputY == 0)
{
//右移
moveX = moveSpeed;
moveZ = moveSpeed;
}
else if (inputX > 0 && inputY > 0)
{
//右前移
moveX = 0;
moveZ = moveSpeed;
}
else if (inputX > 0 && inputY < 0)
{
//右后移
moveX = moveSpeed;
moveZ = 0;
}
else if (inputX < 0 && inputY == 0)
{
//左移
moveX = -moveSpeed;
moveZ = -moveSpeed;
}
else if (inputX < 0 && inputY > 0)
{
//左上移
moveX = -moveSpeed;
moveZ = 0;
}
else if (inputX < 0 && inputY < 0)
{
//左下移
moveX = 0;
moveZ = -moveSpeed;
}
#endregion
}
else if (angle > 67.5 && angle <= 112.5)
{
//3
targerAngle = 90;
moveX = inputY == 0 ? 0 : inputY > 0 ? -moveSpeed : moveSpeed;
moveZ = inputX == 0 ? 0 : inputX > 0 ? moveSpeed : -moveSpeed;
}
else if (angle > 112.5 && angle <= 157.5)
{
//4
#region 右下
targerAngle = 135;
if (inputX == 0 && inputY == 0)
{
//idle
moveX = 0;
moveZ = 0;
}
else if (inputX == 0 && inputY > 0)
{
//前移
moveZ = -moveSpeed;
moveX = -moveSpeed;
}
else if (inputX == 0 && inputY < 0)
{
//后退
moveZ = moveSpeed;
moveX = moveSpeed;
}
else if (inputX > 0 && inputY == 0)
{
//右移
moveZ = moveSpeed;
moveX = -moveSpeed;
}
else if (inputX > 0 && inputY > 0)
{
//右前移
moveZ = 0;
moveX = -moveSpeed;
}
else if (inputX > 0 && inputY < 0)
{
//右后移
moveZ = moveSpeed;
moveX = 0;
}
else if (inputX < 0 && inputY == 0)
{
//左移
moveZ = -moveSpeed;
moveX = moveSpeed;
}
else if (inputX < 0 && inputY > 0)
{
//左上移
moveZ = -moveSpeed;
moveX = 0;
}
else if (inputX < 0 && inputY < 0)
{
//左下移
moveZ = 0;
moveX = moveSpeed;
}
#endregion
}
else if (angle > -157.5 && angle <= -112.5)
{
//6
#region 左下
targerAngle = -135;
if (inputX == 0 && inputY == 0)
{
//idle
moveX = 0;
moveZ = 0;
}
else if (inputX == 0 && inputY > 0)
{
//前移
moveX = moveSpeed;
moveZ = -moveSpeed;
}
else if (inputX == 0 && inputY < 0)
{
//后退
moveX = -moveSpeed;
moveZ = moveSpeed;
}
else if (inputX > 0 && inputY == 0)
{
//右移
moveX = -moveSpeed;
moveZ = -moveSpeed;
}
else if (inputX > 0 && inputY > 0)
{
//右前移
moveX = 0;
moveZ = -moveSpeed;
}
else if (inputX > 0 && inputY < 0)
{
//右后移
moveX = -moveSpeed;
moveZ = 0;
}
else if (inputX < 0 && inputY == 0)
{
//左移
moveX = moveSpeed;
moveZ = moveSpeed;
}
else if (inputX < 0 && inputY > 0)
{
//左上移
moveX = moveSpeed;
moveZ = 0;
}
else if (inputX < 0 && inputY < 0)
{
//左下移
moveX = 0;
moveZ = moveSpeed;
}
#endregion
}
else if (angle > -112.5 && angle <= -67.5)
{
//7
targerAngle = -90;
moveZ = inputX == 0 ? 0 : inputX > 0 ? -moveSpeed : moveSpeed;
moveX = inputY == 0 ? 0 : inputY > 0 ? moveSpeed : -moveSpeed;
}
else if (angle > -67.5 && angle <= -22.5)
{
//8
targerAngle = -45;
#region 左上
if (inputX == 0 && inputY == 0)
{
//idle
moveX = 0;
moveZ = 0;
}
else if (inputX == 0 && inputY > 0)
{
//前移
moveZ = moveSpeed;
moveX = moveSpeed;
}
else if (inputX == 0 && inputY < 0)
{
//后退
moveZ = -moveSpeed;
moveX = -moveSpeed;
}
else if (inputX > 0 && inputY == 0)
{
//右移
moveZ = -moveSpeed;
moveX = moveSpeed;
}
else if (inputX > 0 && inputY > 0)
{
//右前移
moveZ = 0;
moveX = moveSpeed;
}
else if (inputX > 0 && inputY < 0)
{
//右后移
moveZ = -moveSpeed;
moveX = 0;
}
else if (inputX < 0 && inputY == 0)
{
//左移
moveZ = moveSpeed;
moveX = -moveSpeed;
}
else if (inputX < 0 && inputY > 0)
{
//左上移
moveZ = moveSpeed;
moveX = 0;
}
else if (inputX < 0 && inputY < 0)
{
//左下移
moveZ = 0;
moveX = -moveSpeed;
}
#endregion
}
else if (angle > 157.5 || angle < 157.5)
{
//5
targerAngle = 180;
moveX = inputX == 0 ? 0 : inputX > 0 ? -moveSpeed : moveSpeed;
moveZ = inputY == 0 ? 0 : inputY > 0 ? -moveSpeed : moveSpeed;
}
#endregion
//旋转
mTransfrom.eulerAngles = new Vector3(0, targerAngle, 0);
//让动画过渡有个缓冲
float currentVel_X = Animator.GetFloat(VEL_X);
float currentVel_Z = Animator.GetFloat(VEL_Z);
float velx = Mathf.Lerp(currentVel_X,moveX,vel_Speed*Time.deltaTime);
float velz = Mathf.Lerp(currentVel_Z, moveZ, vel_Speed * Time.deltaTime);
Animator.SetFloat(VEL_X, velx);
Animator.SetFloat(VEL_Z, velz);
}
float VectorAngle(Vector2 from, Vector2 to)
{
float angle;
Vector3 cross = Vector3.Cross(from, to);
angle = Vector2.Angle(from, to);
return cross.z < 0 ? -angle : angle;
}
}
}
动画混合树