C# 如何循环移动?
在迷你游戏中,我在Unity中的工作是我想要循环前进的方向。我想移动对象并返回到第一个位置,但不只是一次。现在我有了这个代码,可以让我工作,移动到定位和返回系统。如何更改此代码以在移动中生成循环C# 如何循环移动?,c#,unity3d,C#,Unity3d,在迷你游戏中,我在Unity中的工作是我想要循环前进的方向。我想移动对象并返回到第一个位置,但不只是一次。现在我有了这个代码,可以让我工作,移动到定位和返回系统。如何更改此代码以在移动中生成循环 public class TestMovement : MonoBehaviour { public float speed = 3; public Vector3 target = Vector3.zero; private Vector3 origin; void
public class TestMovement : MonoBehaviour
{
public float speed = 3;
public Vector3 target = Vector3.zero;
private Vector3 origin;
void Start(){
origin = transform.position;
}
void Update(){
TestTransform ();
}
void TestTransform (){
transform.position = Vector3.MoveTowards (transform.position, target, speed * Time.deltaTime);
if (transform.position == target) target = origin;
}
}
TestTransform是从Update调用的,这意味着它每帧调用一次。所以,只要你的游戏还在运行,你基本上已经处于一个无止境的循环中。让我们看看您现有的代码和期望的结果: 现有代码立即开始向目标移动。到达目标后,它将目标切换回原点,并开始向新目标返回 您的代码在第一次通过时将目标更改为原点。之后,一旦它返回到现在是原点的新目标,它就只是坐在那里,测试transform.position==target,并在每一帧上反复设置target=origin 如果希望对象在原点和目标之间来回反弹,则需要进行以下几项更改: 你需要第三个向量,我们称之为currentTarget。 启动时,设置currentTarget=target。 在TestTransform中,更改测试的位置,并将target改为在currentTarget上操作。当你改变它时,你需要考虑CurrnTrar是否设置为目标或原点,并选择另一个作为下一个目标。 最终结果应该是currentTarget在目标和原点之间来回更改
旁注:正如其他人在评论中提到的那样,测试向量的精确相等性并不总是有效的-你应该检查向量之间的距离,并等待它小于某个非常小的值。这样你就可以移动任意多个位置,只需为每个目标创建空的游戏对象,并将它们添加到inspector中的列表中。您的变换将在循环中移动,当然,如果您只需要2个位置,请在列表中添加2个元素。另外,我在脚本中添加了所有内容只是为了让它更容易理解,我建议使用管理目标的逻辑进行另一个方法CheckNextPosition
public class TestMovement : MonoBehaviour
{
public float speed = 3;
public List<Transform> targets= new List<Transform();
public Transform target;
protected int currentTargetIndex=0;
void Start(){
origin = transform.position;
target= targets[currentTargetIndex];
}
void Update(){
TestTransform ();
}
void TestTransform (){
transform.position = Vector3.MoveTowards (transform.position, target.position, speed * Time.deltaTime);
if (transform.position == target.position)//check if you reached the target
{
if(currentTargetIndex >= targets.Count)//check if you reached the last position in your targets list
{
currentTargetIndex=0;//go to first target in your target list
}
else
{
currentTargetIndex++;// go to next target in your target list
}
target=targets[currentTargetIndex];// set the next target
}
}
}
用乒乓球轻松地做摆动
float distanceBetweenPosts = Vector3.Distance(origin, target);
float distanceTowardTarget = Mathf.PingPong(Time.time * speed, distanceBetweenPosts);
float percentageDistance = distanceTowardTarget / distanceBetweenPosts;
Vector3 currentOffset = (target-origin ) * percentageDistance;
Vector3 currentPosition = origin + currentOffset;
transform.position = currentPosition;
如果要为从原点开始的目标设置特定的时间开始时间,则可以使用:
float distanceTowardTarget = Mathf.PingPong((Time.time-startTime) * speed,
distanceBetweenPosts);
当转换到达目标时,只需检查目标是否为原点。如果是,请将其设置为您的目的地,否则请将其设置为原点。p、 你不应该这样比较两个向量,因为浮点值可能不完全相同。你可以使用一个更有效的数组,用模符号计算下一个索引:currentTargetIndex=currentTargetIndex+1%targets.count;它工作正常,但我有一个小问题。当对象在两个位置之间移动时,我创建了两个空目标对象,它给我的参数超出范围。参数名称:索引列表。计数==2?检查一下。对于2个位置,currentIndex应仅等于0或1。