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模拟龙之谷人物行走简单控制,布布扣,bubuko.com

时间: 2024-08-25 07:07:59

Unity模拟龙之谷人物行走简单控制的相关文章

龙之谷手游WebVR技术分享

主要面向Web前端工程师,需要一定Javascript及three.js基础:本文主要分享内容为基于three.js开发WebVR思路及碰到的问题:有兴趣的同学,欢迎跟帖讨论. 目录:一.项目体验1.1.项目简介1.2.功能介绍1.3.游戏体验二.技术方案2.1.为什么使用WebVR2.2.常用的WebVR解决方案2.2.1.Mozilla的A-Frame方案2.2.2.three.js及webvr-polyfill方案三.技术实现3.1.知识储备3.2.实现步骤3.3.工作原理四.技术难点4.

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

2017年3月,腾讯正式于全平台上线了<龙之谷>手游,次日冲到了App Store畅销排行第二的位置,并维持到了现在.上线当日百度指数超过40万,微信游戏平台数据显示预约数780多万,而据内部人员透露当日新进用户200W+,这就是<龙之谷>手游在安卓平台上所取得的成绩. 较高的市场期待让腾讯测试团队对<龙之谷>手游的测试倾尽全力,面对"经典IP"和盛大游戏一贯口碑,腾讯测试团队对游戏服务器进行了严格的压力测试,上线后服务器稳定的表现也证明了测试团队的

谈谈龙之谷手游兼容测试的一百个坑

一.项目背景 1. 高价值IP 龙之谷 ,一款优秀的端游移植到手游平台,凭借的丰富的游戏内容和优秀的游戏品质,公测首日便在畅销榜登顶,取得了巨大的成功.  游戏内容不仅继承了端游的内容,还根据手游操作方式以及平台特性进行了改进,使之更适合移动用户操作,界面分部也更加合理.  2.初期兼容性问题较多 龙之谷与其他游戏产品一样,版本初期暴露的兼容性问题很多,类似无法安装以及必现的CRASH等致命问题多次出现外,还存在着大量UI错位.资源加载异常.屏幕分辨率适应差等严重级别的兼容性问题.  二.定制测

UItextField 的简单控制

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{     // Check for non-numeric characters NSUInteger lengthOfString = string.length; for (NSInteger loopIndex = 0; loopIndex < 

HDU 3623 Best Cow Line, Gold(模拟,注意思路,简单)

题目 POJ 3617 和 这道题题目一样,只是范围稍稍再小一点. //模拟试试 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char s[30010][2]; bool bijiao(int st,int ed) { if(st==ed) return true; if(s[st][0]<s[ed][0]) return true; else if(s

OSG模型简单控制

OSG模型简单控制 转自:http://milkcu.sintune.net/blog/archives/1392673560.html 结点基本操作 添加结点 OSG中使用osg::Node和osg::Group装载模型,Node是Group的父类. 可以通过下面代码再场景中显示多个模型: #include <osgDB/ReadFile> #include <osgViewer/Viewer> #include <osg/Node> int main(void) {

ASP.NET MVC 及 Areas 简单控制路由

ASP.NET MVC中怎么去控制路由,这个想关的文章很多,我在这里就是自我总结一下,仅供参考. 1.我们新建一个项目,查看RouteConfig.cs,代码如下: 1 public static void RegisterRoutes(RouteCollection routes) 2 { 3 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 4 5 routes.MapRoute( 6 name: "Default&quo

模拟java.util.Collection一些简单的用法

/* 需求:模拟java.util.Collection一些简单的用法! 注意:java虚拟机中并没有泛型类型的对象.泛型是通过编译器执行一个被称为类型擦除的前段转换来实现的. 1)用泛型的原生类型替代泛型. 原生类型是泛型中去掉尖括号及其中的类型参数的类或接口.泛型中所有对类型变量的引用都替换为类型变量的最近上限类型, 如对于Cage<T extends Animal>, T的引用将用Animal替换,而对于Cage<T>, T 的引用将用Object替换. 2) */ inte

Unity 3D使用GameObject创建一个简单的可移动物体

于Unity 3D游戏的开发.游戏脚本需要3D模拟组合,该脚本将被写入阻力3D为了达到效果对象. 以下是一个小实例,使用Unity 3D实现一个可控制移动的小人.小人能够向前.向后.向左和向右移动. 1.通过 File - > New Scene 创建一个场景: 2.点击Create -> Create Empty 创建一个GameObject,它即是游戏对象: 3.在Inspector 面板里将此对象的名字改为 "hero" (记得按回车键),等一下再脚本中将通过此名字来