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

4
我正在使用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游戏对象来启用这些组件,仅限于该对象。
这就是我需要让我的游戏运行起来的全部内容,请帮忙。
如果这是重复的,请原谅我,因为我不确定如何表达标题。
2个回答

1

使用 gameObject.GetComponentInChildren,你可以在子对象中启用和禁用组件。

ComponentYouNeed component = gameObject.GetComponentInChildren<ComponentYouNeed>();
component.enabled = false;

也可以使用 gameObject.GetComponentsInChildren

谢谢,我不知道你和克里斯谁先回答了,但我已经修复了imgur链接,所以你现在可以看到问题的另一半了。 - user4540474
如果一个游戏对象不处于活动状态,您无法通过获取其组件来激活它。如果我说您甚至无法获取这些组件,那么您需要在HeadMovement脚本中创建相机的公共引用,然后使用cameraRef.setActive(true)来激活。 - Nain

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链接,现在您应该能够看到我的另一个问题。 - user4540474
我不能做第一个,因为我之前已经尝试过了。但是GetComponentsInChildren通过了所有测试,我本想选它作为最佳答案,但我必须为你修复imgur链接以便你能看到问题的另一半。 - user4540474

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接