unity3D之鼠标控制角色行走

</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);
				        }
				    }
			 
			}



                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值