Unity5实例化脚本对象

时间:2020-05-15 09:36:21

标签: c# unity3d

我已经在编辑器中使用[CreateAssetMenu]选项创建了一个可脚本编写的对象,它被称为“ Assets / MyCard1.asset”。在其中,我指定了一些值,例如名称,子画面,攻击,健康状况等。

所以我的目标是基于相同的Prefab生成30张牌,但是当我使用“ Instantiate(gamobject)”时,它将生成具有默认Prefab参数的游戏对象。如何将“ Assets / MyCard [i] .asset”数据分配给每个新生成的卡片(带有代码)?通过将Asset拖动到Prefab的脚本组件中,我可以使用Inspector做到这一点。

[CreateAssetMenu(fileName = "New Card", menuName = "Card")]
public class CardScriptable : ScriptableObject
{
    public new string name;
    public string description;

    public Sprite artwork;

    public int manaCost;
    public int attack;
    public int health;
}


public class SpawnStuff : MonoBehaviour
{
    public GameObject myPrefab;  
    GameObject[] tempKarta = new GameObject[30];

    void Start()
    {
        for (int i = 0; i < 30; i++)
        {
            tempKarta[i] = Instantiate(myPrefab);
            temp.Karta[i]. ?? DRAW_DATA_FROM "Assets/MyCard1.asset" (); // ??
        }

    }
}

我的方法合理吗?如果没有,哪种更好的方法呢?

UPD: 这是我的预设和预制

enter image description here

enter image description here

也是只显示CardScriptable内容的脚本

public class CardDisplay : MonoBehaviour
{

    public CardScriptable card;

    public Text nametext;
    public Text descriptionText;

    public Image artworkImage;

    public Text manaText;
    public Text attackText;
    public Text healthText;

    void Awake()
    {
        nametext.text = card.name;
        descriptionText.text = card.description;

        artworkImage.sprite = card.artwork;

    }

}

3 个答案:

答案 0 :(得分:1)

在添加了更多细节之后,我认为我已经解决了这个问题。

您可以创建另一个ScriptableObject类,该类用作集合,以避免出现外部文件问题,例如

Public class Deck : ScriptableObject {
    Public CardScriptable[] cards;
}

答案 1 :(得分:1)

您已经拥有自己的结构。您所需要的不是在Awake中做任何事情,而是拥有一种类似的方法

public class CardDisplay : MonoBehaviour
{
    public Text nametext;
    public Text descriptionText;

    public Image artworkImage;

    public Text manaText;
    public Text attackText;
    public Text healthText;

    public void Initialize(CardScriptable card)
    {
        nametext.text = card.name;
        descriptionText.text = card.description;

        artworkImage.sprite = card.artwork;

    }
}

然后例如{p}中的CardScriptable[]数组

public class SpawnStuff : MonoBehaviour
{
    // Rather make this of the correct type!
    public CardDisplay myPrefab;  
    private CardDisplay[] tempKarta = new CardDisplay[30];

    // Adjust in Inspector
    public CardScriptable[] availableCardConfigs;

    void Start()
    {
        for (int i = 0; i < 30; i++)
        {
            var config = availableCardConfigs[Random.Range(0, availableCardConfigs.Length)];
            // If you make the prefab of correct type this already returns a CardDisplay
            tempKarta[i] = Instantiate(myPrefab);
            tempKarta[i].Initialize(config);
        }

    }
}

答案 2 :(得分:0)

ScriptableObjects可以拥有自己的方法。在这种情况下,我使用的典型方法是在脚本对象上创建一个方法来实例化卡并在那里分配值,而不是那样实例化卡。

编辑:如果问题出在您不能轻易更改文本/精灵等的情况下,可能是我的误解。我将创建一个处理程序类,将其放置在您的卡预制件上,以保留对您实例化后需要的位置的引用。

那样,您可以将其用于例如GetComponent()。sprite = newSprite;