【问题标题】:2d sprite goes too fast with transform.translate in C# script (unity)2d sprite 在 C# 脚本中使用 transform.translate 过快(统一)
【发布时间】:2018-03-02 04:48:50
【问题描述】:

补充。当我按下 C 按钮时,我的精灵走得太快了。这是一头狼,会以攻击方式突进。但它只是从一个地方到另一个地方,我认为我只是完全使用了错误的代码。我猜它必须与Rigidbody2D = new Vector2 做更多的事情......但我不知道从那里去哪里。这是我目前正在使用的内容。

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

public class tulMoveMount : MonoBehaviour {

    private Animator anim;
    private Rigidbody2D rb;

    private bool goRight = true;
    private bool jump = false;
    private bool idle = true;
    public float lungeDistance;
    public float lungeSpeed;
    public float lungeHeight;

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

    void Update () 
    {
        HandleCommands ();
    }


    void HandleCommands()
    {
        if (!jump && goRight && Input.GetKeyDown (KeyCode.C)) {
            idle = false;
            jump = true;
            anim.SetTrigger ("jump");
            rb = transform.Translate (lungeSpeed + lungeDistance, lungeHeight, 0); // HERE
            idle = true;
            jump = false;
            anim.SetTrigger ("idle");
        }
        if (!jump && !goRight && Input.GetKeyDown (KeyCode.C)) {
            idle = false;
            jump = true;
            anim.SetTrigger ("jump");
            rb = transform.Translate (lungeSpeed + -lungeDistance, lungeHeight, 0); // HERE
            idle = true;
            jump = false;
            anim.SetTrigger ("idle");
        }
    }
}

【问题讨论】:

    标签: c# transform translate unity2d rigid-bodies


    【解决方案1】:

    要从一个点平滑转换到另一个点,您可以在Corouting 中使用Lerp

    在 Lerp 中,第一个参数是起始位置,第二个参数是目标。第三个参数是一个介于 0 和 1 之间的浮点数。如果是 0,则得到 Lerp 中的第一个参数。如果是 1,则获得第二个。如果 0.5 是两者之间的中间点,依此类推...

    所以你需要做的是启动一个 courutine,它与 fps 速率无关,并且会以由 start-target 之间的距离和你希望它移动的时间定义的恒定速度移动你的 GameObject从一个到另一个。

    public class WolfMovement : MonoBehaviour {
    
        Vector3 start;
        Vector3 target;
    
        float lungeSpeed = .8f;
        float lungeDistance = 5;
    
        private IEnumerator coroutine;
    
        void Update () {
            if(Input.GetKeyDown(KeyCode.M) )
            {
                start = transform.position;
                target = new Vector3(transform.position.x + lungeDistance,transform.position.y , transform.position.z);
    
                coroutine = MoveObject(start,target,lungeSpeed);
                StartCoroutine(coroutine);
    
            }
        }
    
        IEnumerator MoveObject (Vector3 start, Vector3 target, float speed){
            float i = 0.0f;
            float rate = 1.0f/speed;
            while (i < 1.0) {
                i += Time.deltaTime * rate;
                transform.position = Vector3.Lerp(start, target, i);
                yield return null;
            }
        }
    
    }
    

    【讨论】:

    • 好的。您基本上只是向我提供了整个代码并解决了问题。我不知道你从哪里来的超级英雄,但谢谢大声笑
    • @JoeClark 哈哈。不客气。我也尝试解决您翻转 2D Sprite 的问题,但不确定是否可行
    【解决方案2】:

    将平移乘以Time.DeltaTime 将使移动在许多帧上变得平滑,然后您只需调整lungeSpeed 即可获得所需的速度。

     rb = transform.Translate ((lungeSpeed + lungeDistance, lungeHeight, 0)*Time.deltaTime);
    

    【讨论】:

    • 是的!我早些时候尝试过,但由于某种原因,它只是不喜欢这样,并不断给我一条错误消息。我现在在学校使用 cpu,所以这可能是问题所在。自从我将项目插入其中以来,我已经看到了很多。当我有机会时,我会在我的家庭 cpu 上尝试一下,然后回复你。感谢您的反馈
    • @JoeClark 您可能需要在*Time.deltaTime 放置在这条线上的位置进行调整以获得您正在寻找的效果。
    猜你喜欢
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2021-03-07
    • 1970-01-01
    相关资源
    最近更新 更多