unity scripts scriptable script posicion obtener objeto hacer como c# unity3d unity3d-editor

c# - scripts - Editor de Unity 4.6, cree un script con datos predefinidos



unity header (2)

Mi secuencia de comandos no está lista para producción, como la respuesta de Venkat, pero debería ser más fácil de entender con fines educativos.

using UnityEngine; using System.Collections; using UnityEditor; using System.IO; [ExecuteInEditMode] public class CharacterTools : MonoBehaviour { [SerializeField, HideInInspector] private string className; private bool waitForCompile = false; private void Update() { if (string.IsNullOrEmpty(className)) return; if (waitForCompile && EditorApplication.isCompiling) waitForCompile = false; if (!waitForCompile && !EditorApplication.isCompiling) { var gameObject = new GameObject(className); Debug.Log("Attempting to add " + className); var c = gameObject.AddComponent(className); className = null; } } [ContextMenu("Create character")] private void CreateCharacter() { string name = "Number" + Random.Range(0, 100).ToString(); string nameTemplate = "{0}Character"; string contentTemplate = @"using UnityEngine; public class {0} : MonoBehaviour {{ }} "; var className = string.Format(nameTemplate, name); var path = Application.dataPath + "/" + className + ".cs"; var scriptFile = new StreamWriter(path); scriptFile.Write(string.Format(contentTemplate, className)); scriptFile.Close(); AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceSynchronousImport); AssetDatabase.Refresh(); this.className = className; this.waitForCompile = true; } }

Uso:

  1. Agregue este script a cualquier objeto en escena.
  2. Haga clic derecho en el componente agregado en el inspector.
  3. Elige "Crear personaje".
  4. Espera unos segundos.

Estoy tratando de crear un botón fácil de usar dentro del Editor de Unity para la creación de personajes y objetos.

Voy a arrojar un poco de información adicional aquí para ayudar a explicar mi problema. Mi juego está estructurado así; Game Controller >> Character Script >> (PlayerName) Script Un objeto de carácter tiene tanto el script de caracteres como el script que lleva su nombre.

Quiero poder hacer clic en "Crear nuevo carácter" en el editor de Unity y hacer lo siguiente; 1) Solicitar un nombre para usar. 2) Crear un objeto de juego vacío llamado Nombre de lo que haya escrito el usuario. 3) Cree un nuevo script de C # con el mismo nombre y agréguelo al objeto. -Quiero que la secuencia de comandos generada tenga un código predeterminado de "Plantilla de caracteres". 4) Adjunte la nueva secuencia de comandos al nuevo objeto de juego vacío y adjunte también una "secuencia de caracteres".

Gracias por adelantado.

Una última subpregunta. ¿Sería mejor acceder al PlayerNamedScript desde el GameController mediante un comportamiento único público en el script de caracteres?

O puede el CharacterScript extender dinámicamente el PlayerNamedScript, hermano.

Espero que eso esté claro. Gracias de nuevo.


Probar esto

Coloque CharacterCreatorEditor.cs en una carpeta llamada Editor en algún lugar de su proyecto.

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; } }



Coloque el siguiente archivo de texto en la ruta "YOUR_PROJECT / Assets / CharacterTemplate.txt" ¡ Si no lo hace, el código NO FUNCIONARÁ!

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 () { } }



Explicación del código

En primer lugar, el script del editor toma todas las variables de entrada (debería ser bastante obvio de lo que son). Una vez que haga clic en el botón hecho, sucederá lo siguiente

  1. Un nuevo GameObject es instanciado
  2. El GameObject instanciado se denomina igual que el Nombre del personaje en el Editor (por ejemplo, John Doe)
  3. El CharacterScript (su script común) está adjunto
  4. Se lee el archivo de texto de la plantilla ("CharacterTemplate.txt"), y todos los datos se reemplazan con los datos que ingresó en la ventana del editor
  5. Esto luego se escribe en un nuevo archivo de script
  6. Actualizamos la Base de datos de activos y esperamos hasta que se compile el nuevo script creado (por ejemplo, JohnDoe.cs)
  7. Por último, adjunte el script al GameObject instanciado en el Paso 1



Para su segunda pregunta, lo que tendrá que hacer es hacer que todos sus PlayerNamedClass extiendan la misma clase base. De esta forma, puede escribir la variable que expondrá en CharacterScript

Entonces, por ejemplo, si llamas a la clase base "NamedCharacterScripts"

En JohnDoe.cs

public class JohnDoe : NamedCharacterScripts

En JaneDoe.cs

public class JaneDoe : NamedCharacterScripts

En 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>(); }

Espero que esto responda a tus preguntas. Si tienes problemas, solo deja un comentario