我在Unity中制作2D游戏,并尝试让一个角色一个接一个地移动以攻击它们。为了使这个动作看起来自然,我想添加一个延迟,即字符跟随其他角色所采用的确切路径,但落后0.5秒。
由于我将状态模式用于我的角色行为,因此移动逻辑位于可编写脚本的对象中。这意味着我无法直接访问Update()或IEnumerator,但我通过传递对附加到characterGameObject的MonoBehaviour脚本的引用来解决这个问题(不确定这部分是否相关,但包括在内以防万一)我不知道有一些奇怪的副作用。
我首先尝试使用IEnumerator,每次执行脚本对象的Execute()调用(每次游戏时都会发生一次),启动一个首先等待一段时间的couroutine,然后移动对象。
void Execute(StateController stateController){
Vector3 movementVector =
Vector3.MoveTowards(actor.transform.position,targetWithOffset,
Time.deltaTime);
stateController.StartCoroutine(stateController.MoveTorwards(movementVector,
delay));
}
public IEnumerator MoveTorwards(Vector3 movementVector, float delay)
{
yield return new WaitForSeconds(delay);
gameObject.transform.position = movementVector;
}
然而,这导致了一个非常奇怪的小故障运动,当角色向目标移动时,角色不断地传送到自身周围。
有没有人对此有所了解?我错过了一个基本上简单的实现,或者我的方法是否正确,并且毛刺运动来自副作用(令人怀疑,因为代码在没有IEnumerator的情况下完美运行,并且当延迟var设置为零时仍然会出现毛刺。 / p>
答案 0 :(得分:0)
字符跟随其他角色所用的确切路径,但是0.5秒 后面。
实施"耗材" 点对点path
结构(即Queue<Vector3>
),并继续记录第一个字符的路径它通过直接或间接记录更新循环(即Update()
)的当前位置。
现在,忽略延迟的想法;只需确保路径系统正常工作,并确保运动正常。
在跟随者实体的每次更新(Update()
或间接)上,移动到路径中的下一个节点,直到它到达;如果是,&#34;消费&#34; 该节点(从&#34;路径&#34;中移除,即.Dequeue()
),以及任何接近的节点被考虑&#34;达到&#34 ;;显然,这将使实体开始走向下一个节点,如果有任何&#34;未达到&#34;节点离开。
当路径从<=1
节点的长度/数量变为>1
个节点时,在开始跟随第一个(或下一个)段之前,请执行延迟;这将创造您正在寻找的效果。
如果路径的长度再次获得<=1
,则意味着它在创建后立即被消耗,这意味着&#34;追随者&#34;实体已经到达&#34;跟随&#34;实体。在这种情况下,根据您的描述,&#34;关注者&#34;实体 攻击 &#34;关注&#34;实体;意味着游戏不会立即结束;在这种情况下,允许&#34;跟随&#34;在开始移动之后再次远离自己(如果暗示应该是这种情况),在&#34;跟随者之前再次应用延迟&#34;开始跟随。 ---这种实现延迟的方法使得行为自动地发生在这种情况下,因为它与在&#34; start&#34;中完成的检查相同。 (实际上是一个循环);无需二次检查。