我在同一个游戏对象上使用多个盒子碰撞器,问题是,是否可以使用
分别引用每个碰撞器
gameObject.getComponent().enabled = false;
请记住,我的碰撞器很少,我希望其中一些保持启用状态,而其他碰撞器将被禁用。
我所做的是创建空的子游戏对象[每个碰撞器一个游戏对象]并为它们分配碰撞器,然后我会为这些子游戏对象分配标签[在您的情况下,它们可以是“AlwaysActive”和“SwitchingActive”或任何更好的名称可以想出]。
然后在父级中,我将使用
GetComponentsinChildren<Collider>
查找所有碰撞器,并检查游戏对象(相应碰撞器)的标签是否符合我的要求。如果是的话,我将完成我所需的任务,否则跳过它。
注意: 子游戏对象上的碰撞器不会在父脚本中调用
OnTriggerEnter
或 OnCollisionEnter
。我使用委托策略将子游戏对象的碰撞传递到父游戏对象中。
您可以通过脚本生成所有碰撞器
var collider1 = gameObject.AddComponent<BoxCollider>();
var collider2 = ...
...
然后您可以设置每个碰撞器的所有属性
https://docs.unity3d.com/ScriptReference/Collider.html
所以你可以根据需要使用每个碰撞器的变量
旧但也许有帮助: 你可以在一个游戏对象中获取多个组件:
Collider[] colls = GetComponents<Collider>();
foreach(var col in colls){
col.isTrigger = false;
}
不管你信不信,这对我有用。您只需将播放器拖入公共变量引用槽并确保其上有 BoxCollision2d 即可。我确信你可以将它用于 3d,但你必须将 Collider2D 部分更改为“对撞机”或其他东西(我猜)。
数组中的数字从 0 开始,对应于右侧检查器中的第 0 个、第 1 个和第 2 个 BoxCollider,您可以将数字更改为您需要的任何碰撞体。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ur_scriptName: MonoBehaviour
{
public Collider2D[] colliders;
public GameObject player;
void Start()
{
colliders = gameObject.GetComponents<Collider2D>();
}
void Update()
{
}
void OnTriggerEnter2D(Collider2D other)
{
if (colliders[2].IsTouching(player.GetComponent<Collider2D>()))
{
Debug.Log("player touching collider 2");
}
}
}