【问题标题】:Move Character to touched Position 2D (Without RigidBody and Animated Movement) UNITY将角色移动到接触位置 2D(没有刚体和动画运动)UNITY
【发布时间】:2018-01-09 20:48:09
【问题描述】:

美好的一天。我正在尝试实现简单的事情,但没有任何效果....

想要的输出:

• 玩家触摸了我的世界中的一个地方

• 角色开始平稳地移动,并带有向该位置移动的动画

实际结果:

• 玩家触摸了我的世界中的一个地方

• 角色只是跳到终点,没有流畅的动作什么的

尝试过的事情:

• Vector2 finalPosition = Camera.main.ScreenToWorldPoint(position); 
transform.position = finalPosition;

在这个场景中,角色只是跳到了终点

• Vector2 finalPosition = Camera.main.ScreenToWorldPoint(position); 
transform.Translate(finalPosition);

在这种情况下,角色会从屏幕上消失。

有什么办法吗?

【问题讨论】:

    标签: c# unity3d animation character


    【解决方案1】:

    您可以使用Vector2.Lerp() 在两点之间平滑移动。

    一些伪代码:

    bool move;
    float t;
    Update()
    {
        if () // insert condition to begin movement
        {
            move = true;
            t = 0; // reset timer
            startPos = transform.position; // store current position for lerp
            finalPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        }
        if (move)
            MovePlayer();
    }
    
    void MovePlayer()
    {
        t += Time.deltaTime / 3f; // 3 is seconds to take to move from start to end
        transform.position = Vector2.Lerp(startPos, finalPosition, t);
        if (t > 3)
        {
            move = false; // exit function
        }
    }
    

    【讨论】:

    • 太棒了!用惊人的解释性 cmets 像一个魅力、惊人的答案一样工作!完美!
    【解决方案2】:

    update:

    transform.position += (final_pos - transform.position).normalized * Time.deltaTime;
    

    这是向您当前位置添加方向...使用增量时间来缩放运动,您可以通过将其全部乘以某个标量值(即任何float 值)来增加或减少速度。请注意,最好normalize 一次而不是每一帧,但这是一般的想法。

    【讨论】:

    • 还请注意,在第二个示例中,角色“消失”在屏幕上的原因是Transform.translate 本质上是朝着您给它的方向移动。基本上做我在我的例子中所做的。问题是你没有按deltaTime 缩放它,所以它发生得如此之快,看起来很直接,你从来没有告诉它停止,所以它无限地继续。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    相关资源
    最近更新 更多