【问题标题】:Unity Prefab script is disabledUnity Prefab 脚本被禁用
【发布时间】:2018-10-09 15:43:48
【问题描述】:

我的预制件有一个脚本,但是,每次生成它时,该脚本都会被禁用。我试过 GetComponent().enable = true (不工作)我附上了一张图片 --> (Prefab) 这是我的代码。 FYI prefab 是使用默认的 UNET LobbyManager 生成的。

LobbyManager 生成预制件,我使用单独的脚本来控制预制件。该脚本已附加到预制件,但在生成时它丢失了,因此我寻找了预制件并尝试通过代码附加它。

GameObject imageTracker_1, imageTracker_2;
public GameObject[] user;
public GameObject myTextObj, origin, canvasUI;
public float distanceFromOrigin;


//public Text myText;

private void Awake()
{

    user[0] = GameObject.FindWithTag("Respawn");
    user[1] = GameObject.FindWithTag("Finish");

}

void Start()
{
    if (!isLocalPlayer)
    {
        Destroy(this);
        return;
    }



    origin = GameObject.Find("PositionOrigin");
    //used for finding text, "GetComponent<Text>" needs to be attached or fails.
    canvasUI = GameObject.Find("Canvas");
    //myText = canvasUI.GetComponentInChildren<Text>();
    // myText.text = "Out of area";
    myTextObj.SetActive(false);

    // we track the vuforia image within the scene and attach the avatar as a child               
    //imageTracker_1 = GameObject.FindWithTag("Respawn");
    //GameObject imageTracker_2 = GameObject.FindWithTag("Finish");
    //transform.SetParent(imageTracker_1.transform, false);
    //transform.parent = imageTracker_1.transform;
}



private void Update()
{

    assigningAvatarToParent();

    distanceFromOrigin = Vector3.Distance(origin.transform.position, transform.position);

    //during start the gameObject will return NULL, this will make sure during every frame the gameObject does not equal null
    if (origin || imageTracker_1 || myTextObj == null)
    {
        myTextObj = GameObject.Find("OutOfBound");
        origin = GameObject.Find("PositionOrigin");
    }
}

void assigningAvatarToParent()
{
    int k = 0;
    while (k < user.Length){

        GameObject avatar = GameObject.Find("player_avatar" + k);
        avatar.transform.SetParent(user[k].transform, false);
        k++;
        Debug.Log("avatar for parents: " + avatar);

    }


    for (int a = 0; a < user.Length; a++)
    {

        GameObject avatar = GameObject.Find("player_avatar" + a);

        if (avatar.GetComponent<playerIdentity>() == null){
            avatar.AddComponent<playerIdentity>();

            origin = GameObject.Find("PositionOrigin");
            canvasUI = GameObject.Find("Canvas");
            myTextObj.SetActive(false);
        }

    }
    return;
}

}

【问题讨论】:

  • 您检查是否有任何错误?在较新版本的 Unity 中,它会自动禁用有错误的组件。
  • 你也可以在这里问:gamedev.stackexchange.com
  • 感谢您的链接。 @MoNarimani 我添加了一张图片,脚本未激活。并且错误只是未定义的对象。但是,我认为它是因为脚本处于非活动状态,因此我无法设置对象。
  • 看起来myTextObj.SetActive(false); 会出错,因为myTextObj 在检查器中是null
  • 你的类继承自哪个类?也许你是从一个网络类继承的,当播放器不是主机时会禁用它自己?

标签: c# unity3d networking augmented-reality


【解决方案1】:

我假设您的脚本源自NetworkBehaviour - 在与服务器建立活动连接之前,该脚本被禁用。这可能是问题吗? (见UNet Documentation

此外,当 Prefab 被实例化时,您的脚本会在 Start() 函数期间从其中删除自己。这就是它丢失的原因。

调用Destroy(this); 将删除脚本组件,但不会删除GameObject(我自己已经陷入这个陷阱大约100 次)。

不确定这是否是您的意图,因为 LobbyManager 正在创建您的 Prefab。但如果是,您可能想改用DestroyImmediate(gameObject);

【讨论】:

  • 感谢您的回答,是的,直到用户有一个活动连接,然后才会生成预制件。预制件具有脚本组件,但在生成时它会丢失。调用 DestroyImmediate(gameObject);已删除预制件。
  • 如果我删除 Destroy();该脚本将与每个预制件一起使用,但是本地用户将无法控制模型。
猜你喜欢
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 2020-12-08
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多