public class Controller : MonoBehaviour {
//人物三个状态, 站立, 行走,奔跑
private const int HERO_IDLE = 0;
private const int HERO_WALK = 1;
private const int HERO_RUN = 2;
//记录当前人物的状态
private int gameState = 0;
//记录当前鼠标点击的3D坐标点
private Vector3 point;
private float time;
// Use this for initialization
void Start () {
SetGameState(HERO_IDLE);
}
// Update is called once per frame
void Update () {
//按下鼠标左键后
if(Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit))
{
//目前场景中只有地形
//其实应当判断一下当前射线碰撞到的对象是否为地形
//得到3D世界中的点击的坐标
point = hit.point;
//设置主角面朝这个点, 主角的x轴,与z轴不应当发生旋转
transform.LookAt(new Vector3(w.x, transform.position.y, point.z));
//用户是否连续点击按钮
if(Time.realtimeSinceStartup - time < 0.2f)
{
//连续点击进入奔跑状态
SetGameState(HERO_RUN);
}
else
{
//点击一次进入走路状态
SetGameState(HERO_WALK);
}
//记录本地点击鼠标的时间
time = Time.realtimeSinceStartup;
}
}
}
void FixedUpdate()
{
switch(gameState)
{
case HERO_IDLE:
break;
case HERO_WALK:
Move(0.05f);
break;
case HERO_RUN:
Move(0.1f);
break;
}
}
void SetGameState(int state)
{
switch(state)
{
case HERO_IDLE:
point = transform.position;
animation.Play("idle");
break;
case HERO_WALK:
animation.Play("walk");
break;
case HERO_RUN:
animation.Play("run");
break;
}
gameState = state;
}
void Move(float speed)
{
if(Mathf.Abs(Vector3.Distance(point, transform.position)) >= 1.3f)
{
//得到主角控制器组件
CharacterController controller = GetComponent<CharacterController>();
//限制移动
Vector3 v = Vector3.ClampMagnitude(point - transform.position, speed);
controller.Move(v);
}
else
{
SetGameState(HERO_IDLE);
}
}
}
Unity 鼠标控制角色移动
最新推荐文章于 2024-05-22 14:00:00 发布