Как установить панель в качестве родительского элемента созданного сборного элемента в Unity?

#c# #unity3d

#c# #unity3d

Вопрос:

Я пытаюсь создать экземпляр a Prefab , а затем сделать Panel его родительским. но это выдает мне эту ошибку:

 Setting the parent of a transform which resides in a Prefab Asset is disabled to prevent data corruption (GameObject: 'TargetIcon').
UnityEngine.Transform:SetParent(Transform)
 

Как я могу избавиться от этой ошибки?

Вот подробности:

У меня есть панель на холсте, которая служит миникартой. У меня есть сборный элемент для создания экземпляра, и панель должна быть создана как родительская для этого сборного элемента. этот код прикреплен к моей панели:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class MapObject {
    public Image icon {get; set;}
    public GameObject owner { get; set; }

}

public class MiniMapController : MonoBehaviour
{
    public Transform playerPos;
    public Camera mapCamera;

    public static List<MapObject> mapObjects = new List<MapObject>();

    public static void RegisterMapObject(GameObject o, Image i)
    {
        Image image = Instantiate(i);
        mapObjects.Add(new MapObject() { owner = o, icon = i });

    }
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        DrawMapIcons();
    }



    void DrawMapIcons()
    {
        foreach(MapObject mo in mapObjects)
        {
            Vector3 screenPos = mapCamera.WorldToViewportPoint(mo.owner.transform.position);
            mo.icon.transform.SetParent(this.transform);
            screenPos.z = 0;
            mo.icon.transform.position = screenPos;
        }
    }
}
 

и затем этот код используется для создания mapobject:

 using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class MakeMapObject : MonoBehaviour
{
    [SerializeField]
    public Image image;
    void Start()
    {
        MiniMapController.RegisterMapObject(this.gameObject, image);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
 

Я не знаю, почему это выдает мне ошибку?

Ответ №1:

Вероятно, здесь ваша ошибка:

 public static void RegisterMapObject(GameObject o, Image i)
{
    Image image = Instantiate(i);
    mapObjects.Add(new MapObject() { owner = o, icon = i });
}
 

Вы создаете экземпляр изображения, но затем передаете сборный элемент своему MapObject .

Попробуйте выполнить:

 mapObjects.Add(new MapObject() { owner = o, icon = image });