我有一个问题,我的运动代码,我是为一个自上而下的RPG在2D。请原谅我缺乏知识,但我只是最近才学会如何编码,这是我第一次尝试运动控制。期望的结果是有两个输入方法:控制器和键盘。我想让它们分开,所以当你使用控制器时,你不能使用键盘,反之亦然。这是密码。
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。
发布于 2014-04-09 07:57:35
必须将rigidbody2d附加到要使用rigidbody2d.velocity移动的对象。但是,每一帧都这么做不是个好主意。相反,您可以使用transform.translate,或者如果您想通过使用刚体来保持物理模拟,则使用rigidbody2d.addforce。
此外,在“编辑”>“项目设置”>“输入”中,请确保从轴中移除WSAD键。
您的代码应该更像这样
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将其与全局轴相关联。
https://stackoverflow.com/questions/22952236
复制相似问题