unity3d 我怎样才能关闭一个物体的二维方块碰撞器,它有一个特定的标签,这个标签离我最近,按下一个键?

gopyfrb3  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(127)

我对unity非常陌生,对C#甚至更新。我有多个带有“Border”标签的对象,在按下一个键时,我想关闭最近的带有标签的对象的方块碰撞器,大约5秒后再打开。我不知道这是否会改变什么,但我希望将脚本添加到我的播放器控制器中。我真的很感激一些帮助,谢谢。

yqhsw0fo

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;
}
vlju58qv

vlju58qv2#

你的问题很广泛,实际上是由多个问题组成的,但让我们看看:
1.我怎样才能得到所有带有某个标签的对象
→您可以使用GameObject.FindGameObjectsWithTag,例如

var borders = GameObject.FindGameObjectsWithTag("Border");

如果这些对象在应用程序生存期内始终相同,则将它们“缓存”到类字段中是有意义的。

  • a怎样才能得到那些中最近的一个

→您可以使用Linqusing System.Linq;)并执行例如

var closest = borders.OrderBy(b => (b.transform.position - transform.position).sqrMagnitude).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比使用magnitudeVector3.Distance更好地进行比较。

  • 我怎样才能得到那个物体的盒子碰撞器?

→您只需使用GetComponent,例如

if(!closest) return;

 var collider = closest.GetComponent<Collider>();
  • 我如何关闭/打开对撞机?

→只需设置enabled

collider.enabled = false;
  • 如何在X秒后重新打开它?

→有多种方式从Coroutinesasync TaskUniTask,具体取决于您的品味和经验。
现在坚持一个常规,做例如。

StartCoroutine(TurnOffAndOnAgain(collider));

 private IEnumerator TurnOffAndOnAgain(Collider collider)
 {
     if(!collider.enabled) yield break;

     collider.enabled = false;

     yield return new WaitForseconds(5f);

     collider.enabled = true;
 }

相关问题