我对unity非常陌生,对C#甚至更新。我有多个带有“Border”标签的对象,在按下一个键时,我想关闭最近的带有标签的对象的方块碰撞器,大约5秒后再打开。我不知道这是否会改变什么,但我希望将脚本添加到我的播放器控制器中。我真的很感激一些帮助,谢谢。
yqhsw0fo1#
您必须实现一个带有yield return WaitForSeconds(5)函数的协同程序
private void OnTriggerEnter(Collider other) { if(other.CompareTag("Player")) { other.GetComponent<BoxCollider>().IsEnabled = false; // something like that look up in Unity documentation StartCoroutine(MyCoroutine(other.GetComponent<BoxCollider>())); } } IEnumerator MyCoroutine (BoxColider box) { yield return new WaitForSeconds(5); box.IsEnabled = true; }
vlju58qv2#
你的问题很广泛,实际上是由多个问题组成的,但让我们看看:1.我怎样才能得到所有带有某个标签的对象→您可以使用GameObject.FindGameObjectsWithTag,例如
GameObject.FindGameObjectsWithTag
var borders = GameObject.FindGameObjectsWithTag("Border");
如果这些对象在应用程序生存期内始终相同,则将它们“缓存”到类字段中是有意义的。
→您可以使用Linq(using System.Linq;)并执行例如
Linq
using System.Linq;
var closest = borders.OrderBy(b => (b.transform.position - transform.position).sqrMagnitude).FirstOrDefault();
见
Enumerable.OrderBy
Enumerable.FirstOrDefault
或者,如果出于某种原因不想使用Linq,可以通过类似于
GameObject closest = null; var smallesMagnitude = Mathf.Infinity; foreach(var b in borders) { var magnitude = (b.transform.position - transform.position).sqrMagnitude; if(magnitude < smallesMagnitude) { smallesMagnitude = magniutde; closest = b; } }
在这两种情况下,Vector3.srqMagnitude比使用magnitude或Vector3.Distance更好地进行比较。
Vector3.srqMagnitude
magnitude
Vector3.Distance
→您只需使用GetComponent,例如
GetComponent
if(!closest) return; var collider = closest.GetComponent<Collider>();
→只需设置enabled
enabled
collider.enabled = false;
→有多种方式从Coroutines到async Task到UniTask,具体取决于您的品味和经验。现在坚持一个常规,做例如。
async Task
UniTask
StartCoroutine(TurnOffAndOnAgain(collider)); private IEnumerator TurnOffAndOnAgain(Collider collider) { if(!collider.enabled) yield break; collider.enabled = false; yield return new WaitForseconds(5f); collider.enabled = true; }
2条答案
按热度按时间yqhsw0fo1#
您必须实现一个带有yield return WaitForSeconds(5)函数的协同程序
vlju58qv2#
你的问题很广泛,实际上是由多个问题组成的,但让我们看看:
1.我怎样才能得到所有带有某个标签的对象
→您可以使用
GameObject.FindGameObjectsWithTag
,例如如果这些对象在应用程序生存期内始终相同,则将它们“缓存”到类字段中是有意义的。
→您可以使用
Linq
(using System.Linq;
)并执行例如见
Enumerable.OrderBy
Enumerable.FirstOrDefault
或者,如果出于某种原因不想使用
Linq
,可以通过类似于在这两种情况下,
Vector3.srqMagnitude
比使用magnitude
或Vector3.Distance
更好地进行比较。→您只需使用
GetComponent
,例如→只需设置
enabled
→有多种方式从Coroutines到
async Task
到UniTask
,具体取决于您的品味和经验。现在坚持一个常规,做例如。