C# 如何在2D游戏中使用WASD键移动精灵?

C# 如何在2D游戏中使用WASD键移动精灵?,c#,unity3d,C#,Unity3d,我想让我的精灵向上或向下或向左或向右移动,我不想要任何其他移动,如西北或东南;它需要向上、向下、向右或向左。互联网上也有类似的帖子,但我想知道为什么我的帖子不起作用。它不会在游戏中启动任何动作 using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMovement : MonoBehaviour { public Sprite Up;

我想让我的精灵向上或向下或向左或向右移动,我不想要任何其他移动,如西北或东南;它需要向上、向下、向右或向左。互联网上也有类似的帖子,但我想知道为什么我的帖子不起作用。它不会在游戏中启动任何动作

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{

    public Sprite Up;
    public Sprite Down;
    public Sprite Right;
    public Sprite Left;
    public float speed;


    // Update is called once per frame
    void Update()
    {

        Vector3 move = transform.position;

        if (Input.GetKey(KeyCode.W))
        {
            GetComponent<SpriteRenderer>().sprite = Up;
            move.z += speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.A))
        {
            GetComponent<SpriteRenderer>().sprite = Left;
            move.x -= speed * Time.deltaTime; 
        }
        if (Input.GetKey(KeyCode.D))
        {
            GetComponent<SpriteRenderer>().sprite = Right;
            move.x += speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.S))
        {
            GetComponent<SpriteRenderer>().sprite = Down;
            move.y -= speed * Time.deltaTime;
        }

      transform.position = move; 
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类玩家运动:单一行为
{
公共精神;
公众精神崩溃;
公共精神权利;
公共精灵左;
公众浮标速度;
//每帧调用一次更新
无效更新()
{
向量3移动=变换位置;
if(Input.GetKey(KeyCode.W))
{
GetComponent().sprite=Up;
move.z+=速度*Time.deltaTime;
}
if(Input.GetKey(KeyCode.A))
{
GetComponent().sprite=Left;
move.x-=速度*Time.deltaTime;
}
if(Input.GetKey(KeyCode.D))
{
GetComponent().sprite=Right;
move.x+=速度*Time.deltaTime;
}
if(Input.GetKey(KeyCode.S))
{
GetComponent().sprite=Down;
move.y-=速度*Time.deltaTime;
}
变换位置=移动;
}
}

对于我所寻找的,我不认为我需要刚体,因为大多数人在他们的运动中都包含刚体。我还是一个初学者,所以深入解释我的代码为什么不工作以及我能做些什么来修复它会很有帮助。谢谢

首先,您应该缓存SpriteRenderer,这里您最多要执行4个GetComponent调用,仅用于移动

然后,您不想直接设置对象的位置,而是移动它。您可以执行transform.Translate(移动)或transform.position+=move


编辑:您可能应该根据最终的移动来指定精灵。在这里,您每次都会覆盖它,因为您的ifs不是独占的。

首先,您应该缓存您的SpriteRenderer,在这里,您最多要进行4次GetComponent调用,仅用于移动

然后,您不想直接设置对象的位置,而是移动它。您可以执行transform.Translate(移动)或transform.position+=move


编辑:您可能应该根据最终的移动来指定精灵。在这里,您每次都会覆盖它,因为您的ifs不是独占的

在您的情况下,
move
if
语句通过时每次都会增加。有两种方法可以禁用双面移动:或者在每个
if
中重写
move
,或者在第一次
if
通过后退出表单功能

脚本中还有另一个问题:A/D按钮需要更新
x
axis,W/S按钮需要更新
z
axis

例如:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public Sprite Up;
    public Sprite Down;
    public Sprite Right;
    public Sprite Left;
    public float speed;


    // Update is called once per frame
    void Update()
    {
        Vector3 move;

        if (Input.GetKey(KeyCode.W))
        {
            GetComponent<SpriteRenderer>().sprite = Up;
            move = new Vector3(-speed * Time.deltaTime, 0, 0);
        }
        if (Input.GetKey(KeyCode.A))
        {
            GetComponent<SpriteRenderer>().sprite = Left;
            move = new Vector3(0, 0, speed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.D))
        {
            GetComponent<SpriteRenderer>().sprite = Right;
            move = new Vector3(speed * Time.deltaTime, 0, 0);
        }
        if (Input.GetKey(KeyCode.S))
        {
            GetComponent<SpriteRenderer>().sprite = Down;
            move = new Vector3(0, 0, -speed * Time.deltaTime);
        }

        transform.position += move;
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类玩家运动:单一行为
{
公共精神;
公众精神崩溃;
公共精神权利;
公共精灵左;
公众浮标速度;
//每帧调用一次更新
无效更新()
{
矢量3运动;
if(Input.GetKey(KeyCode.W))
{
GetComponent().sprite=Up;
移动=新矢量3(-speed*Time.deltaTime,0,0);
}
if(Input.GetKey(KeyCode.A))
{
GetComponent().sprite=Left;
移动=新矢量3(0,0,速度*时间.deltaTime);
}
if(Input.GetKey(KeyCode.D))
{
GetComponent().sprite=Right;
移动=新矢量3(速度*时间增量,0,0);
}
if(Input.GetKey(KeyCode.S))
{
GetComponent().sprite=Down;
移动=新矢量3(0,0,-速度*时间.deltaTime);
}
transform.position+=移动;
}
}

在您的情况下,当
语句通过时,
移动
每次都会增加。有两种方法可以禁用双面移动:或者在每个
if
中重写
move
,或者在第一次
if
通过后退出表单功能

脚本中还有另一个问题:A/D按钮需要更新
x
axis,W/S按钮需要更新
z
axis

例如:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public Sprite Up;
    public Sprite Down;
    public Sprite Right;
    public Sprite Left;
    public float speed;


    // Update is called once per frame
    void Update()
    {
        Vector3 move;

        if (Input.GetKey(KeyCode.W))
        {
            GetComponent<SpriteRenderer>().sprite = Up;
            move = new Vector3(-speed * Time.deltaTime, 0, 0);
        }
        if (Input.GetKey(KeyCode.A))
        {
            GetComponent<SpriteRenderer>().sprite = Left;
            move = new Vector3(0, 0, speed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.D))
        {
            GetComponent<SpriteRenderer>().sprite = Right;
            move = new Vector3(speed * Time.deltaTime, 0, 0);
        }
        if (Input.GetKey(KeyCode.S))
        {
            GetComponent<SpriteRenderer>().sprite = Down;
            move = new Vector3(0, 0, -speed * Time.deltaTime);
        }

        transform.position += move;
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类玩家运动:单一行为
{
公共精神;
公众精神崩溃;
公共精神权利;
公共精灵左;
公众浮标速度;
//每帧调用一次更新
无效更新()
{
矢量3运动;
if(Input.GetKey(KeyCode.W))
{
GetComponent().sprite=Up;
移动=新矢量3(-speed*Time.deltaTime,0,0);
}
if(Input.GetKey(KeyCode.A))
{
GetComponent().sprite=Left;
移动=新矢量3(0,0,速度*时间.deltaTime);
}
if(Input.GetKey(KeyCode.D))
{
GetComponent().sprite=Right;
移动=新矢量3(速度*时间增量,0,0);
}
if(Input.GetKey(KeyCode.S))
{
GetComponent().sprite=Down;
移动=新矢量3(0,0,-速度*时间.deltaTime);
}
transform.position+=移动;
}
}
解决方案:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{

    public Sprite Up;
    public Sprite Down;
    public Sprite Right;
    public Sprite Left;
    public float speed;



    // Update is called once per frame
    void Update()
    {

        Vector3 move;

        if (Input.GetKey(KeyCode.W))
        {
            GetComponent<SpriteRenderer>().sprite = Up;
            move = new Vector2(0, speed * Time.deltaTime);

            transform.position += move;
        }
        if (Input.GetKey(KeyCode.A))
        {
            GetComponent<SpriteRenderer>().sprite = Left;
            move = new Vector2(speed * Time.deltaTime, 0);

            transform.position -= move;
        }
        if (Input.GetKey(KeyCode.D))
        {
            GetComponent<SpriteRenderer>().sprite = Right;
            move = new Vector2(speed * Time.deltaTime, 0);

            transform.position += move;
        }
        if (Input.GetKey(KeyCode.S))
        {
            GetComponent<SpriteRenderer>().sprite = Down;
            move = new Vector2(0,speed * Time.deltaTime);

            transform.position -= move;
        }

    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类玩家运动:单一行为
{
公共精神;
公众精神崩溃;
公共精神权利;
公共精灵左;
公众浮标速度;
//每帧调用一次更新
无效更新()
{
矢量3运动;
if(Input.GetKey(KeyCode.W))
{
GetComponent().sprite=Up;
移动=新矢量2(0,速度*时间.deltaTime);
transform.position+=移动;
}
if(Input.GetKey(KeyCode.A))
{
GetComponent().sprite=Left;