Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity5实例化可编写脚本的对象_C#_Unity3d - Fatal编程技术网

C# Unity5实例化可编写脚本的对象

C# Unity5实例化可编写脚本的对象,c#,unity3d,C#,Unity3d,我在编辑器中使用[CreateAssetMenu]选项创建了一个可编写脚本的对象,名为“Assets/MyCard1.asset”。在这里,我指定了一些值,如名称、精灵、攻击、生命值等 所以我的目标是基于相同的预设生成一副30张牌,但是当我使用“实例化(gamobject)”时,它会生成一个带有默认预设参数的游戏对象。如何将“资产/MyCard[I].asset”数据分配给每个新生成的卡(带代码)?我可以通过将资源拖动到预置的脚本组件来使用Inspector很好地实现这一点 [CreateAss

我在编辑器中使用[CreateAssetMenu]选项创建了一个可编写脚本的对象,名为“Assets/MyCard1.asset”。在这里,我指定了一些值,如名称、精灵、攻击、生命值等

所以我的目标是基于相同的预设生成一副30张牌,但是当我使用“实例化(gamobject)”时,它会生成一个带有默认预设参数的游戏对象。如何将“资产/MyCard[I].asset”数据分配给每个新生成的卡(带代码)?我可以通过将资源拖动到预置的脚本组件来使用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" (); // ??
        }

    }
}

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

编辑:我可能有误解,如果问题是你不能很容易地改变文本/精灵等。我会制作一个处理程序类放在你的卡片预制上,它保存了你需要实例化的地方的引用


这样,您就可以使用例如GetComponent().sprite=newSprite

在添加了更多的细节之后,我想我已经掌握了这个问题

您可以创建另一个ScriptableObject类作为集合使用,以避免可能出现的任何外部文件问题,例如

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

你们都准备好了。你所需要的不是在
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;

    }
}
然后在中设置一个
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);
        }

    }
}
公共类:单行为
{
//相反,这是正确的类型!
公共卡片显示;
private CardDisplay[]tempKarta=新的CardDisplay[30];
//在检查员中调整
公共卡可脚本[]可用卡配置;
void Start()
{
对于(int i=0;i<30;i++)
{
var config=availableCardConfigs[Random.Range(0,availableCardConfigs.Length)];
//如果您制作了正确类型的预制件,则该预制件已返回CardDisplay
tempKarta[i]=实例化(myPrefab);
tempKarta[i]。初始化(配置);
}
}
}

什么是
kartonka
在你的代码中很不清楚你到底想实现什么…对不起,实际上是myPrefab。让我来编辑一下。你能不能也包括这个预置看起来是什么样的/你想对来自脚本对象的数据做什么?包括一些屏幕截图。基本上,这些资产包含我想要包含在新实例化对象中的数据。我可以在inspector中拖动它们,但不能在代码中拖动。您确实在使用unity5?但我的CardScriptable类的公共变量为空。我的意思是,它不是包含sprite图像和其他数据的“CardScriptable.cs”,而是不能用Visual Studio打开的资产。如何在代码中而不是在inspector中从asset菜单创建的.asset文件中提取数据?好的,我明白了,所以我应该创建一个类来保存整个卡片收集权限,而不是这些资产?正是我一直在寻找的,非常感谢!有一个问题,在这个脚本数组中包含我的全部300多张卡片可以吗?或者是否应该有另一种方式来存储卡(例如,可能有一些生成的卡不是从卡组中开始的)。如果合理,那就好了!目前从阵列中只需要30张随机卡(包括重复的!)。您可以根据自己的喜好定义自己的方式,以便仅从那里获取某些卡片,或者不获取;)我会把它们放在一个地方,然后可能会过滤某些值。。。例如,您可以给他们一个枚举,如
enumcardtype{CharacterCard,MagicSpell,Effect等}
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);
        }

    }
}