unity3d 游戏中的移动对象

uxh89sit  于 2023-01-17  发布在  其他
关注(0)|答案(3)|浏览(222)

我有一个图像,我尝试使用函数四处移动:

public void MoveXY(Vector2 target)
{
    Vector2 startPosition = this.pos;
    Vector2 endPosition = target;
    float lerpAmount = 0.05f;
    this.pos = Vector2.Lerp(startPosition, endPosition, lerpAmount);
}

我在游戏更新循环中调用它。
我想创建一些变量bool moving来跟踪obj是否在移动,但是我很难想象如何在游戏循环中实现它。
我需要这样的东西:

obj.MoveXY(target1);

如果命令一完成:

obj.MoveXY(target2);

做那件事的正确方法是什么?

fv2wmkja

fv2wmkja1#

您所遇到的困难是游戏应用程序的典型问题。与常规应用程序不同,您不能简单地通过语句序列反映操作序列,因为在每次游戏循环更新时,只有很小一部分语句序列会被执行。
你必须记住游戏的当前状态和每一个动作的更新。这可能会变得相当复杂。这个问题的一个解决方案是使用Finite-state machine,如这里Game Programming Patterns / Design Patterns Revisited: State和这里Gamedevelopment Finite-State Machines: Theory and Implementation所解释的。

7lrncoxx

7lrncoxx2#

// Specify the targets in the inspector
// Make sure you have at least one target, otherwise, you will have an IndexOutOfRange Exception
public Transform[] TargetObjects;
public float MovementSpeed = 1;
private bool objectMoving= false;
private int currentTargetIndex;

public void MoveObjectToTarget(Transform objectToMove, Transform target, float maxDistanceDelta )
{
    objectToMove.position = Vector2.MoveTowards(objectToMove.position, target.position, maxDistanceDelta );
    return (objectToMove.position - target.position).sqrMagnitude < 0.01f;
}

void Update()
{
    if( Input.GetKeyDown( KeyCode.Space ) ) // Toggle whether the object will move to the target
        objectMoving = !objectMoving;

    if( objectMoving )
    {
        if( MoveObjectToTarget( transform, TargetObjects[currentTargetIndex], Time.deltaTime * MovementSpeed; ) )
        {
            Debug.Log( "Target reached" ) ;
            currentTargetIndex = (currentTargetIndex + 1) % TargetObjects.Length ;
        }
    }
}
ldioqlga

ldioqlga3#

您可以使用以下简单代码移动对象:

pulbic class ObjectMove : MonoBehaviour
{
    Vector2 targetPos;
    float lerpAmount = 0.05f;
    public bool moving = true;

    void Update()
    {
        transform.position = Vector2.Lerp(transform.position, targetPos, lerpAmount);

        if(transform.position == target.position)
           moving = false;
    }

    public void MoveXY(Vector2 target)
    {
        targetPos = target;
        moving = true;
    }
}

然后在另一个脚本中,您可以检查对象是否到达目标并设置新目标:

if(obj.moving == false)
   obj.MoveXY(newTarget);

相关问题