C# 仅创建一次资产的Unity脚本

C# 仅创建一次资产的Unity脚本,c#,unity3d,C#,Unity3d,我想在Unity制作一个TCG(交易卡游戏)作为大学作业。我有一些可编写脚本的对象来创建不同类型的卡。问题是我有600多张卡片,所以最好有一个脚本,为每张卡片创建一个卡片资产,并设置它们的参数(加载图像、文本) 有没有办法做到这一点?重要的是,脚本只能运行一次,而不是每次我打开编辑器或启动游戏的新实例时都运行一次。您可以实现一个方法,该方法只能通过UnityEditor中的特定按钮调用,该按钮使用属性生成您的所有资产: #if UNITY_EDITOR using System.IO;

我想在Unity制作一个TCG(交易卡游戏)作为大学作业。我有一些可编写脚本的对象来创建不同类型的卡。问题是我有600多张卡片,所以最好有一个脚本,为每张卡片创建一个卡片资产,并设置它们的参数(加载图像、文本)


有没有办法做到这一点?重要的是,脚本只能运行一次,而不是每次我打开编辑器或启动游戏的新实例时都运行一次。

您可以实现一个方法,该方法只能通过UnityEditor中的特定按钮调用,该按钮使用属性生成您的所有资产:

#if UNITY_EDITOR

    using System.IO;
    using UnityEditor;
    using UnityEngine;

    public static class YourExtensions
    {
        [MenuItem("YourMenu/GenerateAssets")]
        private static void GenerateAssets()
        {
            // TODO Get and parse required information e.g. from Database / Xml or Text file
            // I'ld simply make a new class for that like "CardInformation"

            // List<CardInformation>() cardlist = new List<CardInformation>();


            // Somehow receive your information
            // cardlist.add(new CardInformation(parameters));



            // TODO Generate Scriptableobjects

            // foreach(var cardInfo in cardlist){
                    YourScriptableObjectClass asset = ScriptableObject.CreateInstance<YourScriptableObjectClass > ();

                    string path = AssetDatabase.GetAssetPath (Selection.activeObject);
                    if (path == "") 
                    {
                        path = "Assets";
                    } 
                    else if (Path.GetExtension (path) != "") 
                    {
                        path = path.Replace (Path.GetFileName (AssetDatabase.GetAssetPath (Selection.activeObject)), "");
                    }

                    string assetPathAndName = AssetDatabase.GenerateUniqueAssetPath (path + "/New " + typeof(YourScriptableObjectClass ).ToString() + ".asset");

                    AssetDatabase.CreateAsset (asset, assetPathAndName);

                    AssetDatabase.SaveAssets ();
                    AssetDatabase.Refresh();
                    EditorUtility.FocusProjectWindow ();
                    Selection.activeObject = asset;

                    // TODO here set your passed parameters for this asset
                    // asset.parameter = cardInfo.parameters;
            // end foreach
        }

    }

#endif
\if UNITY\u编辑器
使用System.IO;
使用UnityEditor;
使用UnityEngine;
公共静态类扩展
{
[菜单项(“您的菜单/生成集”)]
私有静态void GenerateAssets()
{
//TODO获取和解析所需信息,例如从数据库/Xml或文本文件
//我只需要为它创建一个新类,比如“CardInformation”
//List()cardlist=新列表();
//以某种方式接收您的信息
//cardlist.add(新的CardInformation(参数));
//TODO生成脚本化对象
//foreach(cardlist中的var cardInfo){
YourScriptableObjectClass资产=ScriptableObject.CreateInstance();
字符串路径=AssetDatabase.GetAssetPath(Selection.activeObject);
如果(路径==“”)
{
path=“资产”;
} 
else if(Path.GetExtension(Path)!=“”)
{
path=path.Replace(path.GetFileName(AssetDatabase.GetAssetPath(Selection.activeObject)),“”);
}
字符串assetPathAndName=AssetDatabase.GenerateUniqueAssetPath(路径+“/New”+typeof(您的ScriptableObjectClass.ToString()+”.asset”);
AssetDatabase.CreateAsset(资产,assetPathAndName);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
EditorUtility.FocusProjectWindow();
Selection.activeObject=资产;
//TODO在此设置为此资源传递的参数
//asset.parameter=cardInfo.parameters;
//端部foreach
}
}
#恩迪夫
资产创建的来源:

除非单击Unity编辑器顶部菜单栏中的按钮,否则永远不会调用此方法


注意:您可以跳过
#if UNITY#u EDITOR
预处理器,只要将该脚本放在名为
EDITOR
的文件夹中即可。这些脚本将自动从任何构建中排除。

是的,有一种方法。但我们需要更多信息。参数从何而来?是否有数据库/XML/文本文件等有两种选择。因为游戏的主题是2018年俄罗斯世界杯,我需要一些球员的照片,他们的名字和位置。我找到了一个EA Sports的API,上面有所有这些细节,所以我可以在该API上请求获取信息,或者我可以制作一个脚本,在本地下载所有图片,然后命名为“克里斯蒂亚诺·罗纳尔多·斯特”从他们的名字中获取更多信息。更好的解决方案是使用一个预制件(我们谈论的是预制件,而不是资产),而不是600,然后调整一个预制件(卡片)根据需要接收游戏属性、图像、声音等。或者对不同的外观使用更多。通过名称加载预设,然后必须放在资源文件夹中,这是不推荐的性能明智的做法。@Battle我有玩家卡和拼写卡的预设。通过使用您的ideea,并不意味着我每次都必须加载属性使用卡片?我是unity的新手,我不太了解所有的概念。使用卡片资产,我只加载一次属性,而且一张卡片资产非常小。@Robet-是的,假设这两个预置就足够了。当你想给玩家施法“火球”时你可以这样做:你知道这是一个咒语,所以你实例化了一个咒语卡片预制件。然后你将该咒语分配给它,这样你就可以在内部读取效果、费用等。然后你设置玩家可以看到的外部(名称、费用、图标、描述)。为了拥有这样的“咒语”准备好了吗?你有很多选择。一个简单的方法就是在你的脚本中创建一个“拼写”类的实例,然后把它们放到一个列表中,或者最好是字典中。谢谢你!我会试试这个。