fjkrl 发表于 2013-3-4 22:58

Unity3D 第六课 用鼠标控制人物奔跑

Unity3D 第六课 用鼠标控制人物奔跑

我们要用到的模型还是

我们玩游戏的时候都有用鼠标来控制当前角色的,行走,奔跑,站立…那么在unity中我们如何来控制角色的这些状态呢?首先我们都知道最原始的角色都有站立,行走,奔跑这些最基本的3个状态,那么怎么用鼠标来控制这3个状态的播放呢?

我们先定义角色的3个状态
[*]//人物的3个状态 站立、行走、奔跑
[*]public const int PLAY_IDLE = 0;
[*]public const int PLAY_WALK = 1;
[*]public const int PLAY_RUN = 2;

复制代码
然后要记录当前的状态
[*]//记录当前人物的状态
[*]private int gameState = 0;

复制代码
以及初始化当前状态
[*]void Start ()
[*]{
[*]//初始设置人物为站立状态
[*]SetGameState(PLAY_IDLE);
[*]}

复制代码
鼠标点击要执行的操作
[*]void MouseDownMover()
[*]{
[*]//按下鼠标左键后
[*]if(Input.GetMouseButtonDown(0))
[*]{
[*]//从摄像机的原点向鼠标点击的对象身上设法一条射线
[*]Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
[*]RaycastHit hit;
[*]//当射线彭转到对象时
[*]if (Physics.Raycast(ray, out hit))
[*]{
[*]//目前场景中只有地形
[*]//其实应当在判断一下当前射线碰撞到的对象是否为地形。
[*]//得到在3D世界中点击的坐标
[*]point = hit.point;
[*]TimeRealtimeSinceStartup();
[*]//设置主角面朝这个点,主角的X 与 Z轴不应当发生旋转,
[*]transform.LookAt(new Vector3(point.x,transform.position.y,point.z));
[*]}
[*]FixedUpdate();
[*]}
[*]
[*]}

复制代码
判断鼠标是否连续点击
[*]void TimeRealtimeSinceStartup()
[*]{
[*]//用户是否连续点击按钮
[*]if(Time.realtimeSinceStartup - time <=0.2f)
[*]{
[*]//连续点击 进入奔跑状态
[*]SetGameState(PLAY_RUN);
[*]}else
[*]{
[*]//点击一次只进入走路状态
[*]SetGameState(PLAY_WALK);
[*]}
[*]
[*]//记录本地点击鼠标的时间
[*]time = Time.realtimeSinceStartup;
[*]}

复制代码
根据当前状态播放当前动画
[*]public void SetGameState(int state)
[*]{
[*]switch(state)
[*]{
[*]case PLAY_IDLE:
[*]//播放站立动画
[*]point = transform.position;
[*]animation.Play("idle");
[*]break;
[*]case PLAY_WALK:
[*]//播放行走动画
[*]animation.Play("walk");
[*]break;
[*]case PLAY_RUN:
[*]//播放奔跑动画
[*]animation.Play("run");
[*]break;
[*]}
[*]gameState = state;
[*]}

复制代码
贴出源代码:
[*]using UnityEngine;
[*]using System.Collections;
[*]
[*]public class Controller : MonoBehaviour
[*]{
[*]
[*]      //人物的3个状态 站立、行走、奔跑
[*]      public const int PLAY_IDLE = 0;
[*]      public const int PLAY_WALK = 1;
[*]      public const int PLAY_RUN= 2;
[*]
[*]      //记录当前人物的状态
[*]      private int gameState = 0;
[*]
[*]      //记录鼠标点击的3D坐标点
[*]      private Vector3 point;
[*]      private float time;
[*]
[*]      void Start ()
[*]      {
[*]                //初始设置人物为站立状态
[*]                SetGameState(PLAY_IDLE);
[*]      }
[*]
[*]      void Update ()
[*]      {
[*]                MouseDownMover();
[*]      }
[*]
[*]      void MouseDownMover()
[*]      {
[*]                //按下鼠标左键后
[*]                if(Input.GetMouseButtonDown(0))
[*]                {
[*]                        //从摄像机的原点向鼠标点击的对象身上设法一条射线
[*]                        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
[*]                        RaycastHit hit;
[*]                        //当射线彭转到对象时
[*]                        if (Physics.Raycast(ray, out hit))
[*]                        {
[*]                              //目前场景中只有地形
[*]                              //其实应当在判断一下当前射线碰撞到的对象是否为地形。
[*]                              //得到在3D世界中点击的坐标
[*]                              point = hit.point;
[*]                              TimeRealtimeSinceStartup();
[*]                              //设置主角面朝这个点,主角的X 与 Z轴不应当发生旋转,
[*]                              transform.LookAt(new Vector3(point.x,transform.position.y,point.z));
[*]                        }
[*]                        FixedUpdate();
[*]                }
[*]
[*]      }
[*]
[*]      void TimeRealtimeSinceStartup()
[*]      {
[*]                //用户是否连续点击按钮
[*]                if(Time.realtimeSinceStartup - time <=0.2f)
[*]                {
[*]                        //连续点击 进入奔跑状态
[*]                        SetGameState(PLAY_RUN);
[*]                }else
[*]                {
[*]                        //点击一次只进入走路状态
[*]                        SetGameState(PLAY_WALK);
[*]                }
[*]
[*]                //记录本地点击鼠标的时间
[*]                time = Time.realtimeSinceStartup;
[*]      }
[*]
[*]      void FixedUpdate()
[*]      {
[*]                switch(gameState)
[*]                {
[*]                        case PLAY_IDLE:
[*]
[*]                              break;
[*]                        case PLAY_WALK:
[*]                              //移动主角 一次移动长度为0.05
[*]                              Move(0.05f);
[*]                              break;
[*]
[*]                        case PLAY_RUN:
[*]                              //奔跑时移动的长度为0.1
[*]                              Move(0.1f);
[*]                              break;
[*]                }
[*]      }
[*]
[*]      public void SetGameState(intstate)
[*]      {
[*]                switch(state)
[*]                {
[*]                        case PLAY_IDLE:
[*]                                 //播放站立动画
[*]                              point = transform.position;
[*]                              animation.Play("idle");
[*]                              break;
[*]                        case PLAY_WALK:
[*]                              //播放行走动画
[*]                              animation.Play("walk");
[*]                              break;
[*]                        case PLAY_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>();
[*]                        //注解3 限制移动
[*]                        Vector3 v = Vector3.ClampMagnitude(point -transform.position,speed);
[*]                        //可以理解为主角行走或奔跑了一步
[*]                        controller.Move(v);
[*]                }
[*]                else
[*]                {
[*]                        //到达目标时 继续保持站立状态。
[*]                        SetGameState(PLAY_IDLE);
[*]                }
[*]      }
[*]}

复制代码
注:本课借鉴于雨松大哥的一个例子,请大家勿喷…

跨光速 发表于 2013-4-14 17:50

Unity3D 第六课 用鼠标控制人物奔跑

readma 发表于 2013-4-15 10:39

shixch 发表于 2013-4-15 19:35

人物模型有没有下载的地方。

失落的羽翼 发表于 2013-7-13 04:19


不错 不错 不错{:soso__3922851084632044791_6:}

hbxtdzc 发表于 2013-8-22 16:45

哥们,你试过没有,u3d会提示有很多错误

gg0401 发表于 2015-10-29 19:04

谢谢,学习中

laimingzhe 发表于 2017-6-10 08:31

很不错

独行者 发表于 2017-6-10 08:22

好帖就是要顶

gor 发表于 2017-6-10 08:29

真心顶
页: [1]
查看完整版本: Unity3D 第六课 用鼠标控制人物奔跑