a和objeler []是gameobjects.I使用yoketme 5次。我得到一些带有a的随机物体并给予它们重力。但是只有1个物体在进入bekleme后失去重力。最后一个是一个覆盖在计时器之前使用yoketme的所有对象(9秒)。如何让bekleme获取所有游戏对象而不是最后一个?
void YokEtme(){
int x = Random.Range (35, 0);
a = objeler [x];
z = a.GetComponent<Transform> ().position;
a.GetComponent<Rigidbody> ().useGravity = true;
Debug.Log (a);
StartCoroutine (bekleme ());
}
IEnumerator bekleme (){
yield return new WaitForSeconds (9);
a.GetComponent<Rigidbody> ().useGravity = false;
a.GetComponent<Rigidbody> ().constraints = RigidbodyConstraints.FreezePosition;
a.transform.position= z;
a.GetComponent<Rigidbody> ().constraints = RigidbodyConstraints.None;
Debug.Log (a);
}
答案 0 :(得分:1)
由于问题中缺少某些背景,请允许我大胆地假设:
a
和z
是MonoBehaviour的字段/属性。 objeler
中随机挑选五个游戏对象,对它们施加重力,并在几秒钟后取消应用重力。 如果我的假设是正确的,问题就很简单了。只有一个选定对象失去引力的原因是因为Unity一次只能执行一个协程
也就是说,即使您拨打YokEtme
五次并且每次都会导致StartCoroutine(bekleme())
,并且预计会有五个协同并行运行,实际上每次调用StartCoroutine(bekleme())
都会丢弃之前运行的协同并开始一个新的。
所以一个可能的解决方案是在一个协程实例中处理所有五个游戏对象。如:
using System.Collections.Generic;
using UnityEngine;
public class SomeMono : MonoBehaviour
{
private List<GameObject> _controlledGOs = new List<GameObject>();
private List<float> _loggedZs = new List<float>();
void YokEtme()
{
int x = Random.Range(35, 0);
a = objeler [x];
a.GetComponent<Rigidbody>().useGravity = true;
_controlledGOs.Add(a);
_loggedZs.Add(a.GetComponent<Transform>().position);
}
void SetGravityForGameObjects()
{
for (var i = 0; i < 5; i++)
YokEtme();
StartCoroutine()
}
IEnumerator bekleme ()
{
yield return new WaitForSeconds (9);
for (var i = 0; i < _controlledGOs.Count; i++)
{
var a = _controlledGOs[a];
a.GetComponent<Rigidbody>().useGravity = false;
a.GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePosition;
a.transform.position= _loggedZs[i];
a.GetComponent<Rigidbody>().constraints = RigidbodyConstraints.None;
Debug.Log (a);
}
}
}