如何在脚本中仅使用游戏对象启用 Unity C# 中的部件/组件

Posted

技术标签:

【中文标题】如何在脚本中仅使用游戏对象启用 Unity C# 中的部件/组件【英文标题】:How do I enable Parts/Components in Unity C# with only a game object in the script 【发布时间】:2015-11-06 17:14:24 【问题描述】:

我正在使用 Photon 在我的游戏中制作多人游戏,以确保一个玩家不会控制所有玩家,当你重生时,客户端会激活你的脚本/相机,以便你可以看到和移动。

虽然我想不出解决这个问题的方法,因为我不知道如何启用/禁用子组件或启用子组件。

我想通过脚本来启用它 http://imgur.com/ZntA8Qx

还有这个 http://imgur.com/Nd0Ktoy

我的脚本是这样的:

using UnityEngine;
using System.Collections;

public class NetworkManager : MonoBehaviour 

public Camera standByCamera;
// Use this for initialization
void Start () 
Connect();


void Connect() 
Debug.Log("Attempting to connect to Master...");
PhotonNetwork.ConnectUsingSettings("0.0.1");


void OnGUI() 

GUILayout.Label(PhotonNetwork.connectionStateDetailed.ToString());


void OnConnectedToMaster() 
Debug.Log("Joined Master Successfully.");
Debug.Log("Attempting to connect to a random room...");
PhotonNetwork.JoinRandomRoom();


void OnPhotonRandomJoinFailed()
Debug.Log("Join Failed: No Rooms.");
Debug.Log("Creating Room...");
PhotonNetwork.CreateRoom(null);


void OnJoinedRoom() 
Debug.Log("Joined Successfully.");
SpawnMyPlayer();

void SpawnMyPlayer() 
GameObject myPlayerGO = (GameObject)PhotonNetwork.Instantiate("Body", Vector3.zero, Quaternion.identity, 0);
standByCamera.enabled = false;
((MonoBehaviour)myPlayerGO.GetComponent("Movement")).enabled = true;



monobehaivour 底部的位是我要启用它们的位置 如您所见,我已经弄清楚如何激活我生成的游戏对象的一部分,我只需要上面所说的帮助,谢谢您的帮助。

我通过预制件生成它,因此我希望它只编辑我生成的那个,而不是关卡中的所有其他组件,因为我想使用 myPlayerGO 游戏对象启用这些组件,而那个仅限。

这就是让我的游戏正常运行所需的全部内容,所以请帮忙。

如果这是重复的,我很抱歉,因为我不知道如何写这个标题。

【问题讨论】:

【参考方案1】:

两个图片链接都指向同一个地方,但我想我明白了。

我可能会建议您放置某种脚本,以便您将 HeadMovement 脚本连接到 Body 游戏对象中。例如:

public class BodyController : MonoBehaviour

  public HeadMovement headMovement;

然后你可以在你的预制件中把它连接起来,然后调用:

BodyController bc = myPlayerGo.GetComponent<BodyController>();
bc.headMovement.enabled = true;

另一个解决方法是使用 GetComponentsInChildren():

HeadMovement hm = myPlayerGo.GetComponentsInChildren<HeadMovement>(true)[0]; //the true is important because it will find disabled components.
hm.enabled = true;

我可能会说第一个是更好的选择,因为它更明确,也更快。如果您有多个 HeadMovements,那么您将遇到问题。它还需要爬取整个预制层次结构,才能找到在编译时已经知道位置的东西。

【讨论】:

我正在尝试这些,同时修复了 imgur 链接,您现在应该可以看到我的其他问题了, 我不能做第一个,因为我之前已经尝试过了。但是 GetComponentsInChildren 以优异的成绩通过,我会将此作为最佳答案,但我必须修复 imgur 链接才能让您看到问题的另一半。【参考方案2】:

您可以使用 gameObject.GetComponentInChildren

启用和禁用子对象中的组件
ComponentYouNeed component = gameObject.GetComponentInChildren<ComponentYouNeed>();
component.enabled = false;

也可以使用gameObject.GetComponentsInChildren

【讨论】:

谢谢你,我不知道你和克里斯之间谁先回答,但我修复了 imgur 链接,这样你就可以看到问题的另一半 如果游戏对象未激活,您无法通过获取其组件来激活它,或者如果我说您甚至无法获取这些组件,那么您需要做的是创建相机的公共引用在您的 HeadMovement 脚本中,然后用户 cameraRef.setActive(true) 激活。

以上是关于如何在脚本中仅使用游戏对象启用 Unity C# 中的部件/组件的主要内容,如果未能解决你的问题,请参考以下文章

unity c#

Unity 开发心得

Unity 开发心得

unity中两脚本间怎么传值呢?

Unity (C#) - 如何在销毁/重生系统中挑选出被 Raycast 检测到的 GameObject

如何在 C# 或 JavaScript 的输入日期类型中仅启用当前日期