我有一张图片,我正在尝试使用一个函数来移动:
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);
这样做的正确方法是什么?
答案 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 ;
}
}
}