c# - 使用 UI 按钮移动游戏对象

标签 c# unity3d

我正在尝试通过 UI 按钮设置对 Player 游戏对象的控制。 2d 自上而下 View 场景。

当我释放左/右/上/下 ui 按钮时,我想在固定距离(Axix X 左右方向为 0.8,上下方向为 2.4)上平滑地传输 Player 对象。

我在这里找到了平滑移动的代码,但是当按下 ui 按钮时,Player 一直在移动。

你能帮我让它在鼠标向上(指针向上)时移动并移动 public x= 0.8f 左/右,public y = 2.4f 向上/向下

同时我想对 x 轴和 y 轴上的移动使用不同的速度(peblic)

如果它应该完全是使用 smth 的其他脚本,比如 transform.translate,那也没关系 请指导任何可能的解决方案。谢谢

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;

public class PlayerControl : MonoBehaviour
{

    float movX;
    float movY;
    Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        movX = CrossPlatformInputManager.GetAxisRaw("Horizontal");
        movY = CrossPlatformInputManager.GetAxisRaw("Vertical");

          rb.velocity = new Vector2(movX * 1, movY * 1);

    }
}

最佳答案

此脚本可以通过 WASD 键移动。 这应该在 x 时间量(速度)内按请求的量移动您的游戏对象。 目前它只能在到达目的地时移动,但您可以通过停止协程轻松修改它:)

using System.Collections;
using UnityEngine;

public class PlayerControl : MonoBehaviour
{
    // We gonna move by WASD keys

    [Header("Speed & Movement settings")]
    [SerializeField]
    float Speed = 2.0f;
    [SerializeField]
    float movSpeedX = 0.8f;
    [SerializeField]
    float movSpeedY = 2.4f;

    bool ReachedTarget = true;

    void Update()
    {
        if (ReachedTarget)
        {
            Vector2 dest = Vector2.zero;
            Vector2 currentPos = transform.position;
            if (Input.GetKeyUp(KeyCode.W))
            {
                dest = currentPos + (Vector2.up * movSpeedY);
                StartCoroutine(moveTo(dest, Speed));
            }
            else if (Input.GetKeyUp(KeyCode.S))
            {
                dest = currentPos + (Vector2.down * movSpeedY);
                StartCoroutine(moveTo(dest, Speed));
            }
            else if (Input.GetKeyUp(KeyCode.D))
            {
                dest = currentPos + (Vector2.right * movSpeedX);
                StartCoroutine(moveTo(dest, Speed));
            }
            else if (Input.GetKeyUp(KeyCode.A))
            {
                dest = currentPos + (Vector2.left * movSpeedX);
                StartCoroutine(moveTo(dest, Speed));
            }
        }
    }

    // Time to take is in seconds
    IEnumerator moveTo(Vector2 TargetPosition, float TimetoTake)
    {
        Vector2 originalPosition = transform.position;
        float Time_taken = 0f;
        ReachedTarget = false;
        while (Time_taken < 1)
        {
            Time_taken += Time.deltaTime / TimetoTake;
            // Interpolating between the original and target position this basically provides your "speed"
            transform.position = Vector2.Lerp(originalPosition, TargetPosition, Time_taken);
            yield return null;
        }
        Time_taken = 0;
        transform.position = TargetPosition;
        ReachedTarget = true;
    }
}

关于c# - 使用 UI 按钮移动游戏对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58688364/

相关文章:

c# - 如何清除 Mono MVC2 应用程序中的 OutputCache

c# - 由于内部错误,服务器无法处理请求

c# - 流式处理 WCF 大量对象

c# - 如何使用 Newtonsoft.Json 从 JSON 子数组中获取数据?

unity3d - 构建大小比 editor.log 中记录的大得多

c# - UnityEngine.GameObject 与 Generic.List<UnityEngine.GameObject>

c# - 如何在使用相机点击触摸屏时创建波纹效果

c# - Parallel.ForEach 不喜欢 IList

c# - unity3d - 加速度计灵敏度

unity3d - 如何在 Unity 上结合 Cardboard VR + Vuforia AR 插件?