using UnityEngine; using System.Collections; 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; 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)) { //目前场景中只有地形 //其实应当在判断一下当前射线碰撞到的对象是否为地形。 //得到在3D世界中点击的坐标 point = hit.point; //设置主角面朝这个点,主角的X 与 Z轴不应当发生旋转, //注解1 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.05 Move(0.05f); break; case HERO_RUN: //奔跑时移动的长度为0.1 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) { //注解2 //主角没到达目标点时,一直向该点移动 if(Mathf.Abs(Vector3.Distance(point, transform.position))>=1.3f) { //得到角色控制器组件 CharacterController controller = GetComponent<CharacterController>(); //注解3 限制移动 Vector3 v = Vector3.ClampMagnitude(point - transform.position,speed); //可以理解为主角行走或奔跑了一步 controller.Move(v); }else { //到达目标时 继续保持站立状态。 SetGameState(HERO_IDLE); } } }
角色移动面朝方向
精选 转载qazqaz12378 博主文章分类:unity3d
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
获取鼠标移动的方向
获取鼠标移动的方向
javascript 前端 html 事件对象 jquery对象