C# 查找游戏对象的禁用组件并再次启用它
我有一个键,可以禁用当前游戏对象的网格渲染器和BoxCollider组件。在这些被禁用并且用户再次按下相同的键之后,我想再次启用这些相同的组件,但它似乎无法找到这些被禁用的组件。我如何才能找到这两个组件并再次启用它们?提前谢谢C# 查找游戏对象的禁用组件并再次启用它,c#,unity3d,gameobject,C#,Unity3d,Gameobject,我有一个键,可以禁用当前游戏对象的网格渲染器和BoxCollider组件。在这些被禁用并且用户再次按下相同的键之后,我想再次启用这些相同的组件,但它似乎无法找到这些被禁用的组件。我如何才能找到这两个组件并再次启用它们?提前谢谢 下面是我正在使用的脚本的链接(我在函数的第27+28行禁用了组件,并且在函数的第36+37行尝试再次启用它们): 编辑:或者告诉我我犯了什么错误。为什么不迭代所有组件并启用/禁用它 var allComponents : Component[]; allComponent
下面是我正在使用的脚本的链接(我在函数的第27+28行禁用了组件,并且在函数的第36+37行尝试再次启用它们):
编辑:或者告诉我我犯了什么错误。为什么不迭代所有组件并启用/禁用它
var allComponents : Component[];
allComponents = gameObject.GetComponents (Component);
for (var component : Component in allComponents) {
// check here if this component is of interest may be by checking
// tag and if it is of interest do the following
//enable disable
component.enabled = !component.enabled;
}
[编辑]
统一5.3
public Component[] GetComponentsInChildren(Type t, bool includeInactive = false);
如果includeInactive为true,将返回所有活动和非活动的游戏对象。
因此,您现在执行以下操作
Component [] compList = yourGameObj.GetComponentsInChildren(typeof(Component));
//or type of game object
foreach(Component comp : compList){
//do your magic
}
[编辑]
我们不是来照看孩子的,我现在使用的电脑中没有安装Unity,但是代码看起来是这样的(适合您的需要):
您可以在代码中保留组件的引用,因此不需要一直获取它们。 以下是一个例子:
public class Strut : Photon.MonoBehaviour
{
MeshRenderer _meshRenderer;
BoxCollider _collider;
void Start()
{
_meshRenderer = GetComponent<MeshRenderer> ();
_collider= GetComponent<BoxCollider> ();
}
[RPC]
public IEnumerator HideStrut()
{
_meshRenderer.enabled = false;
_collider.enabled = false;
yield return 0;
PhotonNetwork.UnAllocateViewID(this.photonView.viewID);
}
[RPC]
public IEnumerator ShowStrut()
{
_meshRenderer.enabled = true;
_collider.enabled = true;
yield return 0;
PhotonNetwork.UnAllocateViewID(this.photonView.viewID);
}
公共类支柱:Photon.monobhavior
{
网格渲染器\u网格渲染器;
BoxCollider\u对撞机;
void Start()
{
_meshRenderer=GetComponent();
_collider=GetComponent();
}
[RPC]
公共IEnumerator HideStrut()
{
_meshRenderer.enabled=false;
_collider.enabled=false;
收益率为0;
PhotonNetwork.UnAllocateViewID(this.photonView.viewID);
}
[RPC]
公共IEnumerator showstrop()
{
_meshRenderer.enabled=true;
_collider.enabled=true;
收益率为0;
PhotonNetwork.UnAllocateViewID(this.photonView.viewID);
}
你能用C#@alexo1001写下这个吗?唯一的“主要”区别是:foreach(所有组件中的组件comp){comp.enabled=!comp.enabled},这不会改变概念本身…我将如何用脚本内部替换comp和compList?它会给我一条错误消息,告诉我:无法将typeUnityEngine.Component'隐式转换为
UnityEngine.MeshRenderer'。存在显式转换(是否缺少转换?)可能是try MeshRenderer=(MeshRenderer)compList[0];它应该可以找到组件。这种情况对禁用的游戏对象有效,除非您有对它的引用,否则无法找到它。向我们展示调用“ShowStrut”的代码函数。它在代码中。哦,我错过了。你能用debug.log
确认函数是通过RPC调用的吗?有没有理由不缓存对这些组件的引用并将它们保留为字段?
public class Strut : Photon.MonoBehaviour
{
MeshRenderer _meshRenderer;
BoxCollider _collider;
void Start()
{
_meshRenderer = GetComponent<MeshRenderer> ();
_collider= GetComponent<BoxCollider> ();
}
[RPC]
public IEnumerator HideStrut()
{
_meshRenderer.enabled = false;
_collider.enabled = false;
yield return 0;
PhotonNetwork.UnAllocateViewID(this.photonView.viewID);
}
[RPC]
public IEnumerator ShowStrut()
{
_meshRenderer.enabled = true;
_collider.enabled = true;
yield return 0;
PhotonNetwork.UnAllocateViewID(this.photonView.viewID);
}