我个人挺喜欢龙之谷(DN)的人物控制的(不是广告哈....),就是人物太萌了一点,动作、打击感都挺好的。

今天用Unity简单模仿了一下DN的人物控制,当然,游戏里面动作很多,我这里只做了简单的walk和run的测试哈,但是感觉也蛮舒服的,哈哈。

期待的效果:鼠标旋转控制视角位置,滚轮控制镜头缩放。点击一次W键为行走,快速点击两次为奔跑。

1.准给工作:

场景中,

一个Camera、一块地皮、一只Cube

2.镜头的缩放和旋转实现:

看下Camera的组件:

再看下Cube的组件:

mouselook和smoothfollow的脚本就不贴出来了,都有的。

为了方便,下面是NMove和TestMove的代码:

[csharp] view plain copy
  1. using UnityEngine;
  2. using System.Collections;
  3. public class NMove : MonoBehaviour {
  4. //注意,开始之所以在滑动滚轮的时候,相机是抛物线的形式靠近/远离目标的,原因是,目标模型的中心点设置在了脚底。
  5. //解决方法:设置初始时,相机的高度与人物模型中心的高度一致,即可!
  6. public int MouseWheelSensitivity = 5;   //鼠标敏感度
  7. public int MouseZoomMin = 2;            //最小值
  8. public int MouseZoomMax = 10;           //最大值
  9. public float normalDistance;            //正常距离
  10. public GameObject Camera;
  11. smooth_follow CameraScript;
  12. // Use this for initialization
  13. void Start ()
  14. {
  15. CameraScript = Camera.GetComponent<smooth_follow>();
  16. }
  17. void LateUpdate()
  18. {
  19. if (Input.GetAxis("Mouse ScrollWheel") != 0)        //转动了滚轮
  20. {
  21. Debug.Log(Input.GetAxis("Mouse ScrollWheel"));
  22. //Debug.Log(distance);
  23. if (normalDistance >= MouseZoomMin && normalDistance <= MouseZoomMax)
  24. {
  25. normalDistance -= Input.GetAxis("Mouse ScrollWheel") * MouseWheelSensitivity;
  26. }
  27. if (normalDistance < MouseZoomMin)
  28. {
  29. normalDistance = MouseZoomMin;
  30. }
  31. if (normalDistance > MouseZoomMax)
  32. {
  33. normalDistance = MouseZoomMax;
  34. }
  35. CameraScript.distance = normalDistance;
  36. }
  37. }
  38. }

TestMove.cs:

[csharp] view plain copy
  1. using UnityEngine;
  2. using System.Collections;
  3. public class TestMove : MonoBehaviour {
  4. public float speed = 1.0f;
  5. public GameObject camera;
  6. //当按下行走坐标后,物体旋转至camera的方向
  7. public float rospeed = 1.0f;    //rotate speed
  8. // Update is called once per frame
  9. void Update () {
  10. if (Input.GetKey(KeyCode.W | KeyCode.S | KeyCode.A | KeyCode.D))
  11. {
  12. //按下了行走键,旋转
  13. transform.rotation = Quaternion.Slerp(transform.rotation,camera.transform.rotation ,Time.deltaTime*rospeed);
  14. transform.eulerAngles = new UnityEngine.Vector3(0,transform.eulerAngles.y,transform.eulerAngles.z);
  15. //notice only Quaternion have Slerp methods.
  16. }
  17. if (Input.GetKey(KeyCode.W))
  18. {
  19. this.transform.Translate(Vector3.forward*Time.deltaTime*speed);
  20. }
  21. if (Input.GetKey(KeyCode.S))
  22. {
  23. this.transform.Translate(Vector3.forward * Time.deltaTime * speed * -1);
  24. }
  25. if (Input.GetKey(KeyCode.D))
  26. {
  27. this.transform.Translate(Vector3.right * Time.deltaTime * speed);
  28. }
  29. if (Input.GetKey(KeyCode.A))
  30. {
  31. this.transform.Translate(Vector3.right * Time.deltaTime * speed * -1);
  32. }
  33. }
  34. }

OK,现在你的Cube角色已经活动自如了!

注意,我这里用Cube因为是标准的立方体,主要是为了方便。

3.添加你喜欢的人物模型,制作状态机,使Cube成为其父物体:

状态机:

下面是PlayerSM(state machine)的代码:

[csharp] view plain copy
  1. using UnityEngine;
  2. using System.Collections;
  3. /// <summary>
  4. /// @author ZJC  player state machine study note
  5. /// 问题:
  6. /// 1.如何实现对同一按键点击两次run,点击一次walk?设置一个信号signal进行区分.要注意按键的逻辑顺序问题,这是关键
  7. /// 2.人物转身的时候,有点斜着飘
  8. /// (恩,这个问题解决,就是girl的父物体,我用了一个标准的cube,这样cube旋转的时候,就不会有那种斜着旋转的效果了,girl也就不会了。
  9. /// </summary>
  10. public class PlayerSM : MonoBehaviour {
  11. private Animator animator;
  12. // 动画状态机参数Key
  13. private static readonly string ActionCMD = "ActionCMD";
  14. private static readonly string Run = "run";
  15. float timefirst = 0f;   //记录按下W的时间
  16. float timesecond = 0f;
  17. int n = 0;
  18. bool runsignal = false;
  19. public float KeyTime = 0.3f;
  20. void Start()
  21. {
  22. animator = this.GetComponent<Animator>();
  23. }
  24. // Update is called once per frame
  25. void Update ()
[csharp] view plain copy
  1. {
  2. AnimatorStateInfo stateinfo = animator.GetCurrentAnimatorStateInfo(0);
  3. if (Input.GetKey(KeyCode.W))
  4. {
  5. print("runsigl = "+runsignal);
  6. if ( !runsignal )
  7. {
  8. animator.SetInteger(ActionCMD, 1);
  9. }
  10. else
  11. {
  12. animator.SetInteger(Run, 1);
  13. animator.SetInteger(ActionCMD, 0);
  14. print("wwwww+runsigal = " + runsignal);
  15. }
  16. }
  17. if (Input.GetKeyDown("w") )
  18. {
  19. //  print("up.....");
  20. // runsignal = false;
  21. if (n == 0)
  22. {
  23. timefirst = Time.time;
  24. n++;
  25. }
  26. else if (n == 1)
  27. {
  28. timesecond = Time.time;
  29. n = 0;
  30. }
  31. if (Mathf.Abs(timesecond - timefirst) <= KeyTime)
  32. {
  33. // print("wreff");
  34. animator.SetInteger(Run, 1);
  35. print("run = 1..........................");
  36. runsignal = true;
  37. }
  38. }
  39. if(!Input.anyKey)   //只要按下了键(包括持续按键),就为真,否则为false
  40. {
  41. //参数清0
  42. animator.SetInteger(ActionCMD, 0);
  43. animator.SetInteger(Run, 0);
  44. runsignal = false;
  45. }
  46. }
  47. }

4.隐藏掉cube的mesh render.再测试,OK!

效果:鼠标位置控制旋转视角、滚轮控制视角缩放、点击一次W人物行走,快速点击两次奔跑,无按键为idle状态。

Unity模拟龙之谷人物行走简单控制相关推荐

  1. Unity模拟龙之谷人物控制(二)

    接着上一篇:Unity模拟龙之谷人物行走简单控制 这一篇是对上一篇的扩展,记下我的学习记录吧!避免遗忘. 这一篇对上一篇中的动作状态进行了扩展,主要是submachine的运用. 看下状态机吧: 关键 ...

  2. HTML5期末大作业:龙之谷网络游戏网站设计——龙之谷网络游戏(9页) 学生网游网页设计模板 大学生HTML网页制作作品 简单手游网页设计成品 dreamweaver学生网站模板

    HTML5期末大作业:龙之谷网络游戏网站设计--龙之谷网络游戏(9页) 学生网游网页设计模板 大学生HTML网页制作作品 简单手游网页设计成品 dreamweaver学生网站模板 常见网页设计作业题材 ...

  3. HTML+CSS+JS——龙之谷网络游戏(9页) 学生网游网页设计模板 大学生HTML网页制作作品 简单手游网页设计成品 dreamweaver学生网站模板

    HTML5期末大作业 文章目录 HTML5期末大作业 一.作品展示 二.文件目录 三.代码实现 四.获取更多源码 一.作品展示 二.文件目录 三.代码实现 <!DOCTYPE html> ...

  4. 盛大游戏李阳:龙之谷服务器设计

    原文链接:http://www.gameres.com/779278.html 9月23日,首届"梦想·匠心"腾讯游戏开发者大会于深圳举行,在技术分论坛上,盛大游戏<龙之谷& ...

  5. 龙之谷手游WebVR技术分享

    目录: 一.项目体验 1.1.项目简介 1.2.功能介绍 1.3.游戏体验 二.技术方案 2.1.为什么使用WebVR 2.2.常用的WebVR解决方案 2.2.1.Mozilla的A-Frame方案 ...

  6. 欢乐互娱庞池海:《龙之谷》项目性能优化经验分享

    欢乐互娱庞池海:<龙之谷>项目性能优化经验分享 在5月12日,UNITY 2017案例分享专场上,欢乐互娱技术引擎开发工程师娱庞池海分享了<龙之谷>项目性能优化经验.以下为分享 ...

  7. 阻击外挂——《龙之谷手游》安全测试的那点事

    作者:sheldon,腾讯游戏漏洞测试高级工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/302.html ...

  8. 日新进用户200W+,解密《龙之谷》手游背后的压测故事

    商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/299.html 2017年3月,腾讯正式于全平台上线了<龙 ...

  9. Unity 基础 之 在 UGUI 上简单实现VideoPlayer视频播放的功能,简单暂停播放/显示视频名称/显示时长/拖拽播放等

    Unity 基础 之 在 UGUI 上简单实现VideoPlayer视频播放的功能,简单暂停播放/显示视频名称/显示时长/拖拽播放等 目录 Unity 基础 之 在 UGUI 上简单实现VideoPl ...

最新文章

  1. 通风与防排烟工程电子书_暖通、通风、防排烟风管如何做抗震设计呢?
  2. Android四大组之ContentProvider
  3. 《Linux From Scratch》第一部分:介绍 第一章:介绍-1.3. 更新日志
  4. 有赞的交易系统架构困局以及破局之道
  5. pandas loc和iloc区别
  6. RTMP协议从入门到放弃
  7. java f.lenth返回值_long length
  8. asp.net学习之SqlDataSource 2 select的四种参数赋予形式的解释
  9. javascript将内嵌式广告隐藏
  10. MySQL增量备份恢复和基于时间点与位置的恢复
  11. 初学Python目前我认为较容易理解的求100以内质数(素数)的方法。
  12. 嵌入式C语言static关键字
  13. Word格式处理控件Aspose.Words for .NET教程——如何删除页脚,但保留页眉完整
  14. Jcrop+ajaxFileUpload 图片裁切上传 oss(java web)
  15. vue 前端传图片文件,后端接收
  16. 程序员必备的软技能-金字塔原理拆解(上)
  17. Seurat | 强烈建议收藏的单细胞分析标准流程(SCTransform normalization)(四)
  18. vue 基于elementUI、sortablejs的表格拖拽排序
  19. 侬用洲的移动通信复习资料
  20. 【珍藏版】 2012Java开发工程师必备精品资料(115个)

热门文章

  1. Linux下socket多人聊天室
  2. 解决从GitHub下载文件时缓慢的问题
  3. 【史上最全】重装ubuntu20.04系统基本环境配置
  4. openssl官网文档资料
  5. 并非从0开始的c++ day12
  6. 自己怎样看待在工作中犯错误
  7. java基础—java内存模型(JMM)CPU架构、缓存一致性、重排序、JMM的实现、JMM保证可见性、有序性问题的详解
  8. Django 建立索引
  9. 一种基于微博呼叫接入的ACD排队路由方法
  10. React developer tools调试工具下载及安装教程