</pre><pre name="code" class="csharp"><pre name="code" class="csharp"> using UnityEngine;
using System.Collections;
public class test002 : MonoBehaviour
{
//人物的三个状态 站立、行走、奔跑
private const int HERO_IDLE = 0;
private const int HERO_WALK = 1;
private const int HERO_RUN = 2;
//记录当前人物的状态
private int gameState = 0;
//记录鼠标点击的D坐标点
private Vector3 point;
private float time;
void Start ()
{
//初始设置人物为站立状态
SetGameState(HERO_IDLE);
}
void Update ()
{
//按下鼠标左键后
if(Input.GetMouseButtonDown(0))
{
//从摄像机的原点向鼠标点击的对象身上设法一条射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
//当射线彭转到对象时
if (Physics.Raycast(ray, out hit))
{
//目前场景中只有地形
//其实应当在判断一下当前射线碰撞到的对象是否为地形。
//得到在D世界中点击的坐标
point = hit.point;
//设置主角面朝这个点,主角的X 与 Z轴不应当发生旋转,
//注解
transform.LookAt(new Vector3(point.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:
//移动主角 一次移动长度为0.5
Move(0.5f);
break;
case HERO_RUN:
//奔跑时移动的长度为1
Move(1.0f);
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);
}
}
}
unity3D之鼠标控制角色行走
最新推荐文章于 2024-05-02 00:16:28 发布