Unity模拟龙之谷人物行走简单控制
我个人挺喜欢龙之谷(DN)的人物控制的(不是广告哈....),就是人物太萌了一点,动作、打击感都挺好的。
今天用Unity简单模仿了一下DN的人物控制,当然,游戏里面动作很多,我这里只做了简单的walk和run的测试哈,但是感觉也蛮舒服的,哈哈。
期待的效果:鼠标旋转控制视角位置,滚轮控制镜头缩放。点击一次W键为行走,快速点击两次为奔跑。
1.准给工作:
场景中,
一个Camera、一块地皮、一只Cube
2.镜头的缩放和旋转实现:
看下Camera的组件:
再看下Cube的组件:
mouselook和smoothfollow的脚本就不贴出来了,都有的。
为了方便,下面是NMove和TestMove的代码:
![](https://code.csdn.net/assets/CODE_ico.png)
- using UnityEngine;
- using System.Collections;
- public class NMove : MonoBehaviour {
- //注意,开始之所以在滑动滚轮的时候,相机是抛物线的形式靠近/远离目标的,原因是,目标模型的中心点设置在了脚底。
- //解决方法:设置初始时,相机的高度与人物模型中心的高度一致,即可!
- public int MouseWheelSensitivity = 5; //鼠标敏感度
- public int MouseZoomMin = 2; //最小值
- public int MouseZoomMax = 10; //最大值
- public float normalDistance; //正常距离
- public GameObject Camera;
- smooth_follow CameraScript;
- // Use this for initialization
- void Start ()
- {
- CameraScript = Camera.GetComponent<smooth_follow>();
- }
- void LateUpdate()
- {
- if (Input.GetAxis("Mouse ScrollWheel") != 0) //转动了滚轮
- {
- Debug.Log(Input.GetAxis("Mouse ScrollWheel"));
- //Debug.Log(distance);
- if (normalDistance >= MouseZoomMin && normalDistance <= MouseZoomMax)
- {
- normalDistance -= Input.GetAxis("Mouse ScrollWheel") * MouseWheelSensitivity;
- }
- if (normalDistance < MouseZoomMin)
- {
- normalDistance = MouseZoomMin;
- }
- if (normalDistance > MouseZoomMax)
- {
- normalDistance = MouseZoomMax;
- }
- CameraScript.distance = normalDistance;
- }
- }
- }
TestMove.cs:
![](https://code.csdn.net/assets/CODE_ico.png)
- using UnityEngine;
- using System.Collections;
- public class TestMove : MonoBehaviour {
- public float speed = 1.0f;
- public GameObject camera;
- //当按下行走坐标后,物体旋转至camera的方向
- public float rospeed = 1.0f; //rotate speed
- // Update is called once per frame
- void Update () {
- if (Input.GetKey(KeyCode.W | KeyCode.S | KeyCode.A | KeyCode.D))
- {
- //按下了行走键,旋转
- transform.rotation = Quaternion.Slerp(transform.rotation,camera.transform.rotation ,Time.deltaTime*rospeed);
- transform.eulerAngles = new UnityEngine.Vector3(0,transform.eulerAngles.y,transform.eulerAngles.z);
- //notice only Quaternion have Slerp methods.
- }
- if (Input.GetKey(KeyCode.W))
- {
- this.transform.Translate(Vector3.forward*Time.deltaTime*speed);
- }
- if (Input.GetKey(KeyCode.S))
- {
- this.transform.Translate(Vector3.forward * Time.deltaTime * speed * -1);
- }
- if (Input.GetKey(KeyCode.D))
- {
- this.transform.Translate(Vector3.right * Time.deltaTime * speed);
- }
- if (Input.GetKey(KeyCode.A))
- {
- this.transform.Translate(Vector3.right * Time.deltaTime * speed * -1);
- }
- }
- }
OK,现在你的Cube角色已经活动自如了!
注意,我这里用Cube因为是标准的立方体,主要是为了方便。
3.添加你喜欢的人物模型,制作状态机,使Cube成为其父物体:
状态机:
下面是PlayerSM(state machine)的代码:
![](https://code.csdn.net/assets/CODE_ico.png)
- using UnityEngine;
- using System.Collections;
- /// <summary>
- /// @author ZJC player state machine study note
- /// 问题:
- /// 1.如何实现对同一按键点击两次run,点击一次walk?设置一个信号signal进行区分.要注意按键的逻辑顺序问题,这是关键
- /// 2.人物转身的时候,有点斜着飘
- /// (恩,这个问题解决,就是girl的父物体,我用了一个标准的cube,这样cube旋转的时候,就不会有那种斜着旋转的效果了,girl也就不会了。
- /// </summary>
- public class PlayerSM : MonoBehaviour {
- private Animator animator;
- // 动画状态机参数Key
- private static readonly string ActionCMD = "ActionCMD";
- private static readonly string Run = "run";
- float timefirst = 0f; //记录按下W的时间
- float timesecond = 0f;
- int n = 0;
- bool runsignal = false;
- public float KeyTime = 0.3f;
- void Start()
- {
- animator = this.GetComponent<Animator>();
- }
- // Update is called once per frame
- void Update ()
![](https://code.csdn.net/assets/CODE_ico.png)
- {
- AnimatorStateInfo stateinfo = animator.GetCurrentAnimatorStateInfo(0);
- if (Input.GetKey(KeyCode.W))
- {
- print("runsigl = "+runsignal);
- if ( !runsignal )
- {
- animator.SetInteger(ActionCMD, 1);
- }
- else
- {
- animator.SetInteger(Run, 1);
- animator.SetInteger(ActionCMD, 0);
- print("wwwww+runsigal = " + runsignal);
- }
- }
- if (Input.GetKeyDown("w") )
- {
- // print("up.....");
- // runsignal = false;
- if (n == 0)
- {
- timefirst = Time.time;
- n++;
- }
- else if (n == 1)
- {
- timesecond = Time.time;
- n = 0;
- }
- if (Mathf.Abs(timesecond - timefirst) <= KeyTime)
- {
- // print("wreff");
- animator.SetInteger(Run, 1);
- print("run = 1..........................");
- runsignal = true;
- }
- }
- if(!Input.anyKey) //只要按下了键(包括持续按键),就为真,否则为false
- {
- //参数清0
- animator.SetInteger(ActionCMD, 0);
- animator.SetInteger(Run, 0);
- runsignal = false;
- }
- }
- }
4.隐藏掉cube的mesh render.再测试,OK!
效果:鼠标位置控制旋转视角、滚轮控制视角缩放、点击一次W人物行走,快速点击两次奔跑,无按键为idle状态。
Unity模拟龙之谷人物行走简单控制相关推荐
- Unity模拟龙之谷人物控制(二)
接着上一篇:Unity模拟龙之谷人物行走简单控制 这一篇是对上一篇的扩展,记下我的学习记录吧!避免遗忘. 这一篇对上一篇中的动作状态进行了扩展,主要是submachine的运用. 看下状态机吧: 关键 ...
- HTML5期末大作业:龙之谷网络游戏网站设计——龙之谷网络游戏(9页) 学生网游网页设计模板 大学生HTML网页制作作品 简单手游网页设计成品 dreamweaver学生网站模板
HTML5期末大作业:龙之谷网络游戏网站设计--龙之谷网络游戏(9页) 学生网游网页设计模板 大学生HTML网页制作作品 简单手游网页设计成品 dreamweaver学生网站模板 常见网页设计作业题材 ...
- HTML+CSS+JS——龙之谷网络游戏(9页) 学生网游网页设计模板 大学生HTML网页制作作品 简单手游网页设计成品 dreamweaver学生网站模板
HTML5期末大作业 文章目录 HTML5期末大作业 一.作品展示 二.文件目录 三.代码实现 四.获取更多源码 一.作品展示 二.文件目录 三.代码实现 <!DOCTYPE html> ...
- 盛大游戏李阳:龙之谷服务器设计
原文链接:http://www.gameres.com/779278.html 9月23日,首届"梦想·匠心"腾讯游戏开发者大会于深圳举行,在技术分论坛上,盛大游戏<龙之谷& ...
- 龙之谷手游WebVR技术分享
目录: 一.项目体验 1.1.项目简介 1.2.功能介绍 1.3.游戏体验 二.技术方案 2.1.为什么使用WebVR 2.2.常用的WebVR解决方案 2.2.1.Mozilla的A-Frame方案 ...
- 欢乐互娱庞池海:《龙之谷》项目性能优化经验分享
欢乐互娱庞池海:<龙之谷>项目性能优化经验分享 在5月12日,UNITY 2017案例分享专场上,欢乐互娱技术引擎开发工程师娱庞池海分享了<龙之谷>项目性能优化经验.以下为分享 ...
- 阻击外挂——《龙之谷手游》安全测试的那点事
作者:sheldon,腾讯游戏漏洞测试高级工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/302.html ...
- 日新进用户200W+,解密《龙之谷》手游背后的压测故事
商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/299.html 2017年3月,腾讯正式于全平台上线了<龙 ...
- Unity 基础 之 在 UGUI 上简单实现VideoPlayer视频播放的功能,简单暂停播放/显示视频名称/显示时长/拖拽播放等
Unity 基础 之 在 UGUI 上简单实现VideoPlayer视频播放的功能,简单暂停播放/显示视频名称/显示时长/拖拽播放等 目录 Unity 基础 之 在 UGUI 上简单实现VideoPl ...
最新文章
- 通风与防排烟工程电子书_暖通、通风、防排烟风管如何做抗震设计呢?
- Android四大组之ContentProvider
- 《Linux From Scratch》第一部分:介绍 第一章:介绍-1.3. 更新日志
- 有赞的交易系统架构困局以及破局之道
- pandas loc和iloc区别
- RTMP协议从入门到放弃
- java f.lenth返回值_long length
- asp.net学习之SqlDataSource 2 select的四种参数赋予形式的解释
- javascript将内嵌式广告隐藏
- MySQL增量备份恢复和基于时间点与位置的恢复
- 初学Python目前我认为较容易理解的求100以内质数(素数)的方法。
- 嵌入式C语言static关键字
- Word格式处理控件Aspose.Words for .NET教程——如何删除页脚,但保留页眉完整
- Jcrop+ajaxFileUpload 图片裁切上传 oss(java web)
- vue 前端传图片文件,后端接收
- 程序员必备的软技能-金字塔原理拆解(上)
- Seurat | 强烈建议收藏的单细胞分析标准流程(SCTransform normalization)(四)
- vue 基于elementUI、sortablejs的表格拖拽排序
- 侬用洲的移动通信复习资料
- 【珍藏版】 2012Java开发工程师必备精品资料(115个)