首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运动控制(2D场景)

运动控制(2D场景)
EN

Stack Overflow用户
提问于 2014-04-09 03:29:21
回答 1查看 2K关注 0票数 0

我有一个问题,我的运动代码,我是为一个自上而下的RPG在2D。请原谅我缺乏知识,但我只是最近才学会如何编码,这是我第一次尝试运动控制。期望的结果是有两个输入方法:控制器和键盘。我想让它们分开,所以当你使用控制器时,你不能使用键盘,反之亦然。这是密码。

代码语言:javascript
复制
using UnityEngine;
using System.Collections;

public class playerMovement : MonoBehaviour 
{   

    public float Speed = 1;
    private float deadZone = 0.25f;    

    // START - Use this for initialization
    void Start () {}

    // UPDATE is called once per frame - Using deadZone to compensate for faulty controllers etc.... Using options for controller true or false to switch between keyboard and controller input.
    void FixedUpdate () 
    {

        Vector2 stickInput = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));

        if ( Options.useController == true)
        {
            if( Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.A))
            {
                stickInput = Vector2.zero;
            }
            else if ( stickInput.magnitude < deadZone)
            {
                stickInput = Vector2.zero;
            }
            else
            {
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime;
            }

        }

        //Here is keyboard input - this is working great.
        else if ( Options.useController == false)
        {
            if ( Input.GetKey(KeyCode.A) && Input.GetKey (KeyCode.W))
            {
                stickInput = new Vector2(-1f,1f);
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime;  
            }
            else if ( Input.GetKey(KeyCode.W) && Input.GetKey (KeyCode.D))
            {
                stickInput = new Vector2(1f,1f);
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime; 
            }
            else if ( Input.GetKey(KeyCode.S) && Input.GetKey (KeyCode.D))
            {
                stickInput = new Vector2(1f,-1f);
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime; 
            }
            else if ( Input.GetKey(KeyCode.A) && Input.GetKey (KeyCode.S))
            {
                stickInput = new Vector2(-1f,-1f);
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime; 
            }
            else if ( Input.GetKey(KeyCode.W))
            {
                stickInput = new Vector2(0f,1f);
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime; 
            }
            else if ( Input.GetKey(KeyCode.D))
            {
                stickInput = new Vector2(1f,0f);
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime; 
            }
            else if ( Input.GetKey(KeyCode.S))
            {
                stickInput = new Vector2(0f,-1f);
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime; 
            }
            else if  ( Input.GetKey(KeyCode.A))
            {
                stickInput = new Vector2(-1f,0f);
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime; 
            }       
        }




    }
}

当顶层循环执行时,问题就会出现。当useController等于true时,我希望键中的移动为null。只要按住键,它就会工作得很好,但一旦释放键(A、D、S、W),它就退出if语句,播放机将被剩余的GetAxis值移动。

在这个循环中,我必须使用GetAxis作为控制器输入,不幸的是,Unity会自动从键中获取值。是否有一种方法,我不仅可以将速度限制在0,还可以确保在释放键时,GetAxis值也变成0。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-09 07:57:35

必须将rigidbody2d附加到要使用rigidbody2d.velocity移动的对象。但是,每一帧都这么做不是个好主意。相反,您可以使用transform.translate,或者如果您想通过使用刚体来保持物理模拟,则使用rigidbody2d.addforce。

此外,在“编辑”>“项目设置”>“输入”中,请确保从轴中移除WSAD键。

您的代码应该更像这样

代码语言:javascript
复制
void FixedUpdate () 
{

    if (Options.useController)
    {
        // if the controller is enabled do this stuff
        Vector2 stickInput = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
    }
    else
    {
        // else if the controller is not enabled, do this stuff.
        stickinput = new Vector2(0, 0);
        if (Input.GetKey(KeyCode.W)
            stickinput += new Vector2(0, 1);
        if (Input.GetKey(KeyCode.S)
            stickinput += new Vector2(0, -1);
        if (Input.GetKey(KeyCode.A)
            stickinput += new Vector2(-1, 0);
        if (Input.GetKey(KeyCode.D)
            stickinput += new Vector2(1, 0);
        /* can have code like:
         * if (stickinput.x > 0)
         *     animator.crossfade("rightAnimation", 0f);
         * else if (stickinput.x < 0)
         *     animator.crossfade("leftanimation", 0f);
         * else
         *     animator.crossfade("standinganimation", 0f);
         */
    }

        transform.Translate(((stickinput.magnitude > 1) ? stickinput.normalized : stickinput) * speed * Time.fixedDeltaTime, Space.Self);

        // or use the one commented out below
        // rigidbody2D.AddForce(((stickinput.magnitude > 1) ? stickinput.normalized : stickinput) * speed * Time.fixedDeltaTime);


}

注意,我没有使用else if' S,如果有人持有W和S,它会将y分量增加到0。我选择了Space.Self进行本地翻译,但您可以使用Space.World将其与全局轴相关联。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22952236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档