查看: 2915|回复: 6

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

[复制链接]

27

主题

29

听众

512

积分

Rank: 3Rank: 3

升级   0.8%

发表于 2013-3-4 22:58 |显示全部楼层
共享资源获取更多积分!share your resources get more credits!
资源信息 Tutorial Information
教程名称: Unity3D 第六课 用鼠标控制人物奔跑(发布原创教程可获得更多积分哦!)
适用引擎: (资源适用引擎)
教程语种: 中文
教程等级: 小白(等级越高教程越难,但能学到的东西越多)
教程格式: 图文(请用IE9以上浏览器访问本版块)
教程作者: 转载自互联网 (如有问题请短消息联系作者或发表回复)
点击查看原图 --> 美丽分割线
请先回复
哇伊~ (((‵□′))回复太烦了,怒买VIP(充值金额将用于论坛采购更多资源)

--> 请先登录 --> 请先登录 --> 请先登录 --> 请先登录 --> 请先登录 --> 请先登录 -->
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 人评分鲜花 道具币 收起 理由
fuoop + 2 + 4

总评分: 鲜花 + 2  道具币 + 4   查看全部评分

1

主题

21

听众

200

积分

Rank: 2

升级   0%

发表于 2013-4-14 17:50 |显示全部楼层
Unity3D 第六课 用鼠标控制人物奔跑
回复

使用道具 举报

4

主题

19

听众

160

积分

发表于 2013-4-15 10:39 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

0

主题

20

听众

203

积分

Rank: 2

升级   1%

发表于 2013-4-15 19:35 |显示全部楼层
人物模型有没有下载的地方。
回复

使用道具 举报

9

主题

30

听众

829

积分

Rank: 3Rank: 3

升级   21.93%

发表于 2013-7-13 04:19 |显示全部楼层

不错 不错 不错
回复

使用道具 举报

1

主题

20

听众

203

积分

Rank: 2

升级   1%

发表于 2013-8-22 16:45 |显示全部楼层
哥们,你试过没有,u3d会提示有很多错误
回复

使用道具 举报

0

主题

12

听众

34

积分

Rank: 1

升级   17%

发表于 2015-10-29 19:04 |显示全部楼层
谢谢,学习中
回复

使用道具 举报

1

主题

20

听众

203

积分

Rank: 2

升级   1%

发表于 2017-6-10 08:31 |显示全部楼层
很不错
回复

使用道具 举报

3

主题

20

听众

203

积分

Rank: 2

升级   1%

发表于 2017-6-10 08:22 |显示全部楼层
好帖就是要顶
回复

使用道具 举报

0

主题

20

听众

203

积分

Rank: 2

升级   1%

发表于 2017-6-10 08:29 |显示全部楼层
真心顶
回复

使用道具 举报

温馨提示:求助请到“Unity技术讨论”版块中发帖,便于集中解决!
您需要登录后才可以回帖 登录 | 立即注册

懒人模式:

关闭

站长推荐 上一条 /1 下一条

Unity3D游戏开发联盟(资源共享平台) -Unity3D,Unreal ( 苏ICP备12051100号 )   

GMT+8, 2019-11-13 08:51 , Processed in 0.141537 second(s), 89 queries .