找回密码
 立即注册
查看: 4668|回复: 96

[基础] Unity3D 第六课 用鼠标控制人物奔跑

[复制链接]
发表于 2013-3-4 22:58 | 显示全部楼层 |阅读模式
资源信息 Tutorial Information
教程名称: Unity3D 第六课 用鼠标控制人物奔跑(发帖教程)
适用引擎:   (适用引擎,为空默认为Unity)
教程语种: 中文
教程等级: 1
教程格式: 图文(请用IE9以上浏览器访问本版块)
教程作者: 转载自互联网 (如有问题请短消息联系作者或发表回复)
下载地址: (兑换积分)
点击查看原图
美丽分割线
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(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;
  •         }
  •         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);
  •                 }
  •         }
  • }

复制代码

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 1鲜花 +2 +4 收起 理由
fuoop + 2 + 4

查看全部评分

发表于 2013-4-14 17:50 | 显示全部楼层
Unity3D 第六课 用鼠标控制人物奔跑
发表于 2013-4-15 10:39 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2013-4-15 19:35 | 显示全部楼层
人物模型有没有下载的地方。
发表于 2013-7-13 04:19 | 显示全部楼层

不错 不错 不错{:soso__3922851084632044791_6:}
发表于 2013-8-22 16:45 | 显示全部楼层
哥们,你试过没有,u3d会提示有很多错误
发表于 2015-10-29 19:04 | 显示全部楼层
谢谢,学习中
发表于 2017-6-10 08:31 | 显示全部楼层
很不错
发表于 2017-6-10 08:22 | 显示全部楼层
好帖就是要顶
发表于 2017-6-10 08:29 | 显示全部楼层
真心顶
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-21 20:32 , Processed in 0.117044 second(s), 37 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表