Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 移动游戏物体的最好方法是什么,平滑地移动而不是传送?_C#_Unity3d - Fatal编程技术网

C# 移动游戏物体的最好方法是什么,平滑地移动而不是传送?

C# 移动游戏物体的最好方法是什么,平滑地移动而不是传送?,c#,unity3d,C#,Unity3d,我试着将一个游戏对象,口袋妖怪,从屏幕的中心平滑地移动到屏幕的左侧,只沿着水平轴。然而,它保持瞬间传送 代码的作用=在一个无休止的循环中从一个精灵更改为另一个精灵。当它更改为另一个精灵时,它也会更改其比例 我希望代码执行的操作=在更改为其他精灵之前,在水平轴上向左移动 我尝试过线性插值lerp和transform.translate public class Transitions : MonoBehaviour { public Sprite Pokemon_0; // VARIAB

我试着将一个游戏对象,口袋妖怪,从屏幕的中心平滑地移动到屏幕的左侧,只沿着水平轴。然而,它保持瞬间传送

代码的作用=在一个无休止的循环中从一个精灵更改为另一个精灵。当它更改为另一个精灵时,它也会更改其比例

我希望代码执行的操作=在更改为其他精灵之前,在水平轴上向左移动

我尝试过线性插值lerp和transform.translate

public class Transitions : MonoBehaviour
{

    public Sprite Pokemon_0; // VARIABLES FOR SPRITES (Pokemons/ game objects) 
    public Sprite Pokemon_1;

    float timer = 1f; // CHANGING SPRITES VALUES (delays)
    float delay = 5f;

    Vector2 temp;     //CHANGING POSITION VARIABLES
    Vector2 tempPos;
    Vector2 finalPosition;


    void Start()
    {
        this.gameObject.GetComponent<SpriteRenderer>().sprite = Pokemon_0;
    }

    void Update()
    {
        timer -= Time.deltaTime;
    if (timer <= 0)
    {
        if (this.gameObject.GetComponent<SpriteRenderer>().sprite == Pokemon_0) // TO CHANGE FROM POKEMON 1 TO POKEMON 2 
        {
            this.gameObject.GetComponent<SpriteRenderer>().sprite = Pokemon_1;

            temp = transform.localScale;  // TO SET THE SCALE WHEN EACH POKEMON CHANGES (works)
            temp.x = -380;
            temp.y = 350;
            transform.localScale = temp;
            timer = delay;

            finalPosition = new Vector2(167, -107);
            transform.position = Vector3.Lerp(transform.position, finalPosition, 1f * Time.deltaTime);

            //tempPos = transform.position; // Tried and tested method. Doesn't work. 
            //tempPos.x = 1f;
            //transform.position = tempPos;



            return;

        }
        if (this.gameObject.GetComponent<SpriteRenderer>().sprite == Pokemon_1) // TO CHANGE BACK FROM POKEMON 2 TO POKEMON 1
        {
            this.gameObject.GetComponent<SpriteRenderer>().sprite = Pokemon_0;
            timer = delay;
            return;

        }

    }
执行时,此代码确实会更改口袋妖怪和比例。然而,情况依然如此


我是一个新手,所以我一直在尝试不同的建议,谢谢。

在您的代码示例中,您使用的位置x值似乎有所不同。x y和z值一起用于形成一个点,该点在三维环境中表示。每次将x值更改为1时,将对象的位置设置为其先前的位置将在水平轴上将其锁定

可以使用插值平滑两个位置状态之间的过渡,也可以使用Unity的内置Vector3.MoveToward或Vector2(如果在二维景观中)

插值

您所需的位置就是您要更改到的确切位置。您当前的位置将是transform.position

走向


在代码示例中,您使用的位置x值似乎有所不同。x y和z值一起用于形成一个点,该点在三维环境中表示。每次将x值更改为1时,将对象的位置设置为其先前的位置将在水平轴上将其锁定

可以使用插值平滑两个位置状态之间的过渡,也可以使用Unity的内置Vector3.MoveToward或Vector2(如果在二维景观中)

插值

您所需的位置就是您要更改到的确切位置。您当前的位置将是transform.position

走向


最好使用两个引擎,比如

如果您安装了Dotween,那么您只需使用

transform.DOMove(new vector3(1 ,0 , 1) , duration);
您还可以为青少年设置轻松。或使用完整的功能

transform.DOMove(new vector3(1 ,0 , 1) , duration)
    .SetEase(Ease.OutCubic)
    .OnCompelete(() => { shouldClose = true; }); 

您还可以为tween设置循环。SetLoops-1。

最好使用tween引擎,如

如果您安装了Dotween,那么您只需使用

transform.DOMove(new vector3(1 ,0 , 1) , duration);
您还可以为青少年设置轻松。或使用完整的功能

transform.DOMove(new vector3(1 ,0 , 1) , duration)
    .SetEase(Ease.OutCubic)
    .OnCompelete(() => { shouldClose = true; }); 

您也可以为您的tween.SetLoops-1设置循环。

您确实应该使用Lerp:您可以发布一个最小的可复制示例吗?我想在这种情况下,它至少是整个类代码。给它一个刚体和力?添加1个单元也可能比每帧添加1个单元多一点。。如果你得到200fps,它就会飞过更新方法中的代码?@DmitriyPopov Hi,刚刚发布了整个类,并解释了它的功能。我愿意接受建议。你确实应该使用Lerp:你能发布一个最小的可复制的例子吗?我想在这种情况下,它至少是整个类代码。给它一个刚体和力?添加1个单元也可能比每帧添加1个单元多一点。。如果你得到200fps,它就会飞过更新方法中的代码?@DmitriyPopov Hi,刚刚发布了整个类,并解释了它的功能。我愿意接受建议。嗨,我刚试过你的两种方法。不幸的是,它们不适合我。看起来他们好像什么都没做。我的精灵呆在同一个地方。我刚刚用我的全班同学更新了这篇文章,并解释了代码的作用,任何帮助都将不胜感激。Lerp需要起点和终点,而不是当前和终点。它也应该有办法在某个时候达到1。MoveToward被设置为执行非常小的动作。@Everts谢谢,我已经更新了答案。只要精灵在带有脚本的游戏对象上,它就应该工作。如果这似乎没有任何作用,请尝试将步长变量更改为更大的值。lerp的问题是,对象一开始会移动得很快,然后朝目标移动得很慢,当它越来越近时,移动得很慢。这是因为每次移动都是剩余距离的一小部分。所以它是一个极限。所需要的是增加比率,使其达到1并完成移动。嗨,刚刚尝试了两种方法。不幸的是,它们不适合我。看起来他们好像什么都没做。我的精灵呆在同一个地方。我刚刚用我的全班同学更新了这篇文章,并解释了代码的作用,任何帮助都将不胜感激。Lerp需要起点和终点,而不是当前和终点。它也应该有办法在某个时候达到1。MoveToward被设置为执行非常小的动作。@Everts谢谢,我已经更新了答案。只要精灵在带有脚本的游戏对象上,它就应该
奥克。如果这似乎没有任何作用,请尝试将步长变量更改为更大的值。lerp的问题是,对象一开始会移动得很快,然后朝目标移动得很慢,当它越来越近时,移动得很慢。这是因为每次移动都是剩余距离的一小部分。所以它是一个极限。所需要的是增加比率,使其达到1并完成移动。