在游戏中移动物体

时间:2018-10-06 15:38:02

标签: c# unity3d

我有一张图片,我正在尝试使用一个函数来移动:

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);

这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

您遇到的困难是游戏应用程序的典型问题。与常规应用程序不同,您不能简单地通过语句序列反映动作序列,因为每次游戏循环更新都只会执行一小部分。

您必须记住游戏的当前状态以及更新后的每个动作。这可能变得非常复杂。解决此问题的方法是使用Finite-state machine和此处Game Programming Patterns / Design Patterns Revisited: State所述的Gamedevelopment Finite-State Machines: Theory and Implementation

答案 1 :(得分:0)

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

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);

希望对您有帮助。

答案 2 :(得分:0)

// 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 ;
        }
    }
}