【问题标题】:Vector3.MoveTowards is not doing its thingVector3.MoveTowards 没有做它的事
【发布时间】:2018-06-02 17:50:31
【问题描述】:

当我使用 Vector3.MoveTowards 方法时,Plank 无法移动。我不完全确定为什么。有好心人来看看吗?

public class BrickMoveVErtical : MonoBehaviour 
{
    public Vector3 positionOne, positiontwo, nextposition;
    public Transform plankTranform;
    public Transform positionBTransform;
    public float speed;

    void Start () 
    {
        positionOne  = plankTranform.localPosition;
        positiontwo  = positionBTransform.localPosition;
        nextposition = positiontwo;
    }

    void Update () 
    {
        move();
    }
    private void move() 
    {
       plankTranform.localPosition = Vector3.MoveTowards(positionOne,nextposition,Time.deltaTime*speed);
       if(Vector3.Distance(plankTranform.localPosition,nextposition)<0.1)
           changeMovementPlank();
    }
    void changeMovementPlank() 
    {
        nextposition = nextposition != positionOne ? positionOne : positiontwo;
    }                        
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您应该使用当前位置作为current 参数:

    plankTranform.localPosition = Vector3.MoveTowards(plankTranform.localPosition, nextposition,Time.deltaTime*speed);
                                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

    【讨论】:

    • positiontwo 变量的使用也是如此。直接使用转换,否则您将获得陈旧的值。
    • @Nico 感谢您的评论,但Vector3.MoveToward 方法的第一个参数不是初始点吗?在那种情况下,我已经在 start 方法中初始化了 positionOne。
    • @Esla 正确。但是您每帧都在一点一点地移动对象。如果您总是使用起点,您的对象将在每一帧从起点移动一点点(即,真的无处可去),而不是每一帧越来越远。
    • @FredrikWiderberg 谢谢,现在我遇到了另一个问题。当速度设置得太高时,当木板垂直向上时,角色会自动在空中跳跃。知道如何关闭木板的物理特性,以便角色在移动的木板上表现正常吗?
    【解决方案2】:

    这是您刚刚在上一个问题中犯的相同错误之一。 Vector3 是一个值类型,这意味着如果你这样做:

    private v1 = new Vector3(3, 3);
    private v2 = v1;         // v2 has now *copied* the value of v1
    v1 = new Vector(0, 0);   // v1 is now (0, 0), but v2 is still (3, 3)
    

    你所做的实际上就是这样。如果您想要一个始终提供最新值的类似变量的东西,请使用属性,如下所示:

    public Vector3 positionOne
    {
        get { return plank.transform.position;  }
        set { plank.transform.position = value; }
    }
    

    这将始终返回正确和更新的值,当您设置它时,您实际上会更改原始值,而不是副本。

    【讨论】:

    • 我知道变量是如何工作的,但设置属性对我来说是全新的。我现在正在深入研究它。无论如何,这个问题是关于其他事情的。我对Vector3.MoveTowards() 初始参数感到困惑。现在我的疑惑解开了。无论如何感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 2019-07-21
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2011-09-28
    相关资源
    最近更新 更多