gpt4 book ai didi

c# - Unity 4.6 编辑器,使用预定义数据创建脚本

转载 作者:太空狗 更新时间:2023-10-30 01:18:19 26 4
gpt4 key购买 nike

我正在尝试在 Unity 编辑器中制作一个易于使用的按钮,用于创建角色和项目。

我将在这里提供一些额外的信息来帮助解释我的问题。我的游戏结构是这样的;游戏 Controller >> 角色脚本 >> (玩家名)脚本一个角色对象既有角色脚本,也有以它命名的脚本。

我希望能够在 Unity 编辑器中单击“创建新角色”并执行以下操作;1) 提示输入要使用的名称。2) 根据用户输入的内容创建名为 Name 的空游戏对象。3) 新建一个同名的C#脚本,添加到对象中。 -我希望生成的脚本中包含一些预先确定的“角色模板”代码。4) 将新脚本附加到新的空游戏对象,并附加一个“角色脚本”。

提前致谢。

最后一个子问题。通过角色脚本上的公共(public)单一行为从 GameController 访问 PlayerNamedScript 会更好吗?

或者 CharacterScript 可以动态扩展 PlayerNamedScript,兄弟。

我希望这是清楚的。再次感谢。

最佳答案

试试这个

CharacterCreatorEditor.cs 放在项目中某个名为 Editor 的文件夹中。

CharacterCreatorEditor.cs

using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;
using System.Text.RegularExpressions;

public class CharacterCreatorEditor : EditorWindow {

#region Character Fields
//Add as many character specific fields / variables you want here.
//Remember to update the same thing in the "CharacterTemplate.txt"!
public string characterName = "John Doe";

public float characterHealth = 10;

public int characterCost = 1000;

public bool isBadGuy = false;
#endregion


private bool needToAttach = false; //A boolean that checks whether a newly created script has to be attached
private float waitForCompile = 1; //Counter for compile
GameObject tempCharacter; //A temporary GameObject that we assign the new chracter to.


//A Menu Item when clicked will bring up the Editor Window
[MenuItem ("AxS/Create New Character")]
public static void CreateNewChar () {
EditorWindow.GetWindow(typeof(CharacterCreatorEditor));
}


void OnGUI () {

GUILayout.Label("Here's a sample Editor Window. Put in more variables as you need below.");
GUILayout.Space(10);

//Note on adding more fields
//The code below is broken into groups, one group per variable
//While it's relatively long, it keeps the Editor Window clean
//Most of the code should be fairly obvious

GUILayout.BeginHorizontal();
GUILayout.Label("Character Name", new GUILayoutOption[0]);
characterName = EditorGUILayout.TextField(characterName, new GUILayoutOption[0]);
GUILayout.EndHorizontal();
GUILayout.Space(10);

GUILayout.BeginHorizontal();
GUILayout.Label("Character Health", new GUILayoutOption[0]);
characterHealth = EditorGUILayout.FloatField(characterHealth, new GUILayoutOption[0]);
GUILayout.EndHorizontal();
GUILayout.Space(10);

GUILayout.BeginHorizontal();
GUILayout.Label("Character Cost", new GUILayoutOption[0]);
characterCost = EditorGUILayout.IntField(characterCost, new GUILayoutOption[0]);
GUILayout.EndHorizontal();
GUILayout.Space(10);

GUILayout.BeginHorizontal();
GUILayout.Label(string.Format("Is {0} a Bad Guy?", new object[] { characterName }), new GUILayoutOption[0]);
isBadGuy = EditorGUILayout.Toggle(isBadGuy, new GUILayoutOption[0]);
GUILayout.EndHorizontal();
GUILayout.Space(10);

GUI.color = Color.green;

//If we click on the "Done!" button, let's create a new character
if(GUILayout.Button("Done!", new GUILayoutOption[0]))
CreateANewCharacter();

}

void Update () {
//We created a new script below (See the last few lines of CreateANewCharacter() )
if(needToAttach) {

//Some counter we just keep reducing, so we can give the
//EditorApplication.isCompiling to kick in
waitForCompile -= 0.01f;

//So a few frames later, we can assume that the Editor has enough
//time to "catch up" and EditorApplication.isCompiling will now be true
//so, we wait for the newly created script to compile
if(waitForCompile <= 0) {

//The newly created script is done compiling
if(!EditorApplication.isCompiling) {

//Lets add the script
//Here we add the script using the name as a string rather than
//it's type in Angled braces (As done below)
tempCharacter.AddComponent(characterName.Replace(" ", ""));

//Reset the control variables for attaching these scripts.
needToAttach = false;
waitForCompile = 1;
}
}
}
}

private void CreateANewCharacter () {

//Instantiate a new GameObject
tempCharacter = new GameObject();

//Name it the same as the Character Name
tempCharacter.name = characterName;

//Add the ChracterScript component. Note the use of angle braces over quotes
tempCharacter.AddComponent<CharacterScript>();

//Loading the template text file which has some code already in it.
//Note that the text file is stored in the path PROJECT_NAME/Assets/CharacterTemplate.txt
TextAsset templateTextFile = AssetDatabase.LoadAssetAtPath("Assets/CharacterTemplate.txt",
typeof(TextAsset)) as TextAsset;
string contents = "";
//If the text file is available, lets get the text in it
//And start replacing the place holder data in it with the
//options we created in the editor window
if(templateTextFile != null) {
contents = templateTextFile.text;
contents = contents.Replace("CHARACTERCLASS_NAME_HERE", characterName.Replace(" ", ""));
contents = contents.Replace("CHARACTER_NAME_HERE", characterName);
contents = contents.Replace("CHARACTER_HEALTH_HERE", characterHealth.ToString());
contents = contents.Replace("CHARACTER_COST_HERE", characterCost.ToString());
contents = contents.Replace("CHARACTER_BAD_GUY_HERE", isBadGuy.ToString().ToLower());
}
else {
Debug.LogError("Can't find the CharacterTemplate.txt file! Is it at the path YOUR_PROJECT/Assets/CharacterTemplate.txt?");
}

//Let's create a new Script named "CHARACTERNAME.cs"
using(StreamWriter sw = new StreamWriter(string.Format(Application.dataPath + "/{0}.cs",
new object[] { characterName.Replace(" ", "") }))) {
sw.Write(contents);
}
//Refresh the Asset Database
AssetDatabase.Refresh();

//Now we need to attach the newly created script
//We can use EditorApplication.isCompiling, but it doesn't seem to kick in
//after a few frames after creating the script. So, I've created a roundabout way
//to do so. Please see the Update function
needToAttach = true;
}

}



将以下文本文件放入路径“YOUR_PROJECT/Assets/CharacterTemplate.txt”,否则代码将无法运行!

CharacterTemplate.txt

using UnityEngine;
using System.Collections;


public class CHARACTERCLASS_NAME_HERE : MonoBehaviour {

public string characterName = "CHARACTER_NAME_HERE";

public float characterHealth = CHARACTER_HEALTH_HERE;

public int characterCost = CHARACTER_COST_HERE;

public bool isBadGuy = CHARACTER_BAD_GUY_HERE;


public void SomeMethod () {

}
}



代码解释

首先,编辑器脚本获取所有输入变量(应该很明显它们是什么)单击完成按钮后,将发生以下情况

  1. 实例化了一个新的游戏对象
  2. 实例化的 GameObject 的名称与编辑器中的角色名称相同(例如 John Doe)
  3. 已附上 CharacterScript(您的常用脚本)
  4. 读取模板文本文件(“CharacterTemplate.txt”),并将所有数据替换为您在编辑器窗口中输入的数据
  5. 然后将其写入新的脚本文件
  6. 我们刷新 Assets 数据库,等待编译新创建的脚本(例如 JohnDoe.cs)
  7. 最后将脚本附加到步骤 1 中实例化的 GameObject



对于第二个问题,您需要做的是让所有 PlayerNamedClass 扩展相同的基类。这样,您可以键入将在 CharacterScript 中公开的变量

因此,例如,如果您调用基类“NamedCharacterScripts”

JohnDoe.cs

public class JohnDoe : NamedCharacterScripts

JaneDoe.cs

public class JaneDoe : NamedCharacterScripts

CharacterScript.cs

public NamedCharacterScripts namedCharacterScript;

void Awake () {
//This will assign JohnDoe.cs for the GameObject named "John Doe" &
//JaneDoe.cs to the GameObject named "Jane Doe"
namedCharacterScript = GetComponent<NamedCharacterScripts>();
}

希望这能回答您的问题。如果您遇到问题,请发表评论

关于c# - Unity 4.6 编辑器,使用预定义数据创建脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27802185/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com