Unity模拟龙之谷人物行走简单控制
我个人挺喜欢龙之谷(DN)的人物控制的(不是广告哈....),就是人物太萌了一点,动作、打击感都挺好的。
今天用Unity简单模仿了一下DN的人物控制,当然,游戏里面动作非常多,我这里仅仅做了简单的walk和run的測试哈,可是感觉也蛮舒服的,哈哈。
期待的效果:鼠标旋转控制视角位置,滚轮控制镜头缩放。点击一次W键为行走,高速点击两次为奔跑。
1.准给工作:
场景中,
一个Camera、一块地皮、一仅仅Cube
2.镜头的缩放和旋转实现:
看下Camera的组件:
再看下Cube的组件:
mouselook和smoothfollow的脚本就不贴出来了,都有的。
为了方便,以下是NMove和TestMove的代码:
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:
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)的代码:
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 ()
{ 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模拟龙之谷人物行走简单控制的更多相关文章
- 龙之谷手游WebVR技术分享
主要面向Web前端工程师,需要一定Javascript及three.js基础:本文主要分享内容为基于three.js开发WebVR思路及碰到的问题:有兴趣的同学,欢迎跟帖讨论. 目录:一.项目体验1. ...
- 日新进用户200W+,解密《龙之谷》手游背后的压测故事
2017年3月,腾讯正式于全平台上线了<龙之谷>手游,次日冲到了App Store畅销排行第二的位置,并维持到了现在.上线当日百度指数超过40万,微信游戏平台数据显示预约数780多万,而据 ...
- 洛谷试炼场-简单数学问题-P1088 火星人
洛谷试炼场-简单数学问题 A--P1088 火星人 Description 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法 ...
- 模拟java.util.Collection一些简单的用法
/* 需求:模拟java.util.Collection一些简单的用法! 注意:java虚拟机中并没有泛型类型的对象.泛型是通过编译器执行一个被称为类型擦除的前段转换来实现的. 1)用泛型的原生类型替 ...
- OSG模型简单控制
OSG模型简单控制 转自:http://milkcu.sintune.net/blog/archives/1392673560.html 结点基本操作 添加结点 OSG中使用osg::Node和osg ...
- 洛谷试炼场-简单数学问题-P1403 [AHOI2005]-因数
洛谷试炼场-简单数学问题 P1403 [AHOI2005]约数研究 Description 科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机"Samuel I ...
- 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂
洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...
- Python+selenium测试环境成功搭建,简单控制浏览器(firefox)接下来,继续学习其他浏览器上的测试环境搭建;学习Python语言,利用Python语言来写测试用例。加油!!!
Python+selenium测试环境成功搭建,简单控制浏览器(firefox)接下来,继续学习其他浏览器上的测试环境搭建:学习Python语言,利用Python语言来写测试用例.加油!!!
- 洛谷 P4148 简单题 KD-Tree 模板题
Code: //洛谷 P4148 简单题 KD-Tree 模板题 #include <cstdio> #include <algorithm> #include <cst ...
随机推荐
- 行为驱动开发(BDD)
行为驱动开发(BDD) 引言 BDD是对TDD理念的扩展.BDD强调有利害关系的技术团体和非技术团队都要参与到软件开发过程中.可以把它看成一种强调团体间合作的敏捷方法.大多数采用某种敏捷方法的团队最终 ...
- Java调用Lua(转)
Java 调用 Lua app发版成本高,覆盖速度慢,覆盖率页低.一些策略上的东西如果能够从服务端控制会方便一些.所以考虑使用Lua这种嵌入式语言作为策略实现,Java则是宿主语言. 总体上看是一个模 ...
- 在struts2中訪问servletAPI
在struts2中訪问servletAPI,通俗点也就是使用servlet中的两个对象request对象和response对象. 前几天看到一个CRM项目的源代码,里面使用request对象和resp ...
- C++ 习题 输出日期时间--友元类
Description 设计一个日期类和时间类,编写display函数用于显示日期和时间.要求:将Time类声明为Date类的友元类,通过Time类中的display函数引用Date类对象的私有数据, ...
- 左右xcode的重构选项的一些理解
Rename(重命名):对标示符进行重命名,以获得更好的代码可读性,这些标示符包含类,方法或者函数的名称. Extract(抽取):将你在XCode种选择的代码抽取到一个新的方法或函数中. Creat ...
- Cocos2d-x学习笔记(19)(TestCpp源代码分析-3)
本章主要介绍testBasic.h/cpp,这两个文件主要用于返回主场景界面. //testBasic.h #ifndef _TEST_BASIC_H_ #define _TEST_BASIC_H_ ...
- #define XXX do{ XXX } while(0) 为什么使用
#define XXX do{ XXX } while(0) 为什么使用 时常会遇到一个非常"奇怪的宏定义", rt.(欧西巴...思考不够深刻啊, 皮鞭, 啪啪啪) 近期又遇到这 ...
- socket计划编制的原则
socket编程原理 1.问题的引入 1) 普通的I/O操作过程: UNIX系统的I/O命令集,是从Maltics和早期系统中的命令演变出来的,其模式为打开一读/写一关闭(open-write-rea ...
- Agile/CMMI/Scrum
Agile/CMMI/Scrum 一.背景介绍 在朋友(aehyok)的建议下,初步去了解Visual Studio Online,简称VS Online(即原来的 Team Foundation S ...
- poj 3237 Tree(树链拆分)
题目链接:poj 3237 Tree 题目大意:给定一棵树,三种操作: CHANGE i v:将i节点权值变为v NEGATE a b:将ab路径上全部节点的权值变为相反数 QUERY a b:查询a ...