Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找游戏对象的禁用组件并再次启用它_C#_Unity3d_Gameobject - Fatal编程技术网

C# 查找游戏对象的禁用组件并再次启用它

C# 查找游戏对象的禁用组件并再次启用它,c#,unity3d,gameobject,C#,Unity3d,Gameobject,我有一个键,可以禁用当前游戏对象的网格渲染器和BoxCollider组件。在这些被禁用并且用户再次按下相同的键之后,我想再次启用这些相同的组件,但它似乎无法找到这些被禁用的组件。我如何才能找到这两个组件并再次启用它们?提前谢谢 下面是我正在使用的脚本的链接(我在函数的第27+28行禁用了组件,并且在函数的第36+37行尝试再次启用它们): 编辑:或者告诉我我犯了什么错误。为什么不迭代所有组件并启用/禁用它 var allComponents : Component[]; allComponent

我有一个键,可以禁用当前游戏对象的网格渲染器和BoxCollider组件。在这些被禁用并且用户再次按下相同的键之后,我想再次启用这些相同的组件,但它似乎无法找到这些被禁用的组件。我如何才能找到这两个组件并再次启用它们?提前谢谢
下面是我正在使用的脚本的链接(我在函数的第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?它会给我一条错误消息,告诉我:无法将type
UnityEngine.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);
    }