C# 仅创建一次资产的Unity脚本
我想在Unity制作一个TCG(交易卡游戏)作为大学作业。我有一些可编写脚本的对象来创建不同类型的卡。问题是我有600多张卡片,所以最好有一个脚本,为每张卡片创建一个卡片资产,并设置它们的参数(加载图像、文本)C# 仅创建一次资产的Unity脚本,c#,unity3d,C#,Unity3d,我想在Unity制作一个TCG(交易卡游戏)作为大学作业。我有一些可编写脚本的对象来创建不同类型的卡。问题是我有600多张卡片,所以最好有一个脚本,为每张卡片创建一个卡片资产,并设置它们的参数(加载图像、文本) 有没有办法做到这一点?重要的是,脚本只能运行一次,而不是每次我打开编辑器或启动游戏的新实例时都运行一次。您可以实现一个方法,该方法只能通过UnityEditor中的特定按钮调用,该按钮使用属性生成您的所有资产: #if UNITY_EDITOR using System.IO;
有没有办法做到这一点?重要的是,脚本只能运行一次,而不是每次我打开编辑器或启动游戏的新实例时都运行一次。您可以实现一个方法,该方法只能通过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-是的,假设这两个预置就足够了。当你想给玩家施法“火球”时你可以这样做:你知道这是一个咒语,所以你实例化了一个咒语卡片预制件。然后你将该咒语分配给它,这样你就可以在内部读取效果、费用等。然后你设置玩家可以看到的外部(名称、费用、图标、描述)。为了拥有这样的“咒语”准备好了吗?你有很多选择。一个简单的方法就是在你的脚本中创建一个“拼写”类的实例,然后把它们放到一个列表中,或者最好是字典中。谢谢你!我会试试这个。