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);
[*] }
[*] }
[*]}
复制代码
注:本课借鉴于雨松大哥的一个例子,请大家勿喷…
Unity3D 第六课 用鼠标控制人物奔跑 人物模型有没有下载的地方。
不错 不错 不错{:soso__3922851084632044791_6:} 哥们,你试过没有,u3d会提示有很多错误 谢谢,学习中 很不错 好帖就是要顶 真心顶
页:
[1]