4

キャラクターとアイテムの作成用に、Unity エディター内で使いやすいボタンを作成しようとしています。

私の問題を説明するために、ここで少し余分な情報を捨てます。私のゲームは次のように構成されています。Game Controller >> Character Script >> (PlayerName)Script キャラクター オブジェクトには、キャラクター スクリプトとそれにちなんで名付けられたスクリプトの両方があります。

Unity エディターで [Create New Character] をクリックできるようにしたいのですが、次のことができます。1) 使用する名前を要求します。2) ユーザーが入力したものから Name という名前の空のゲーム オブジェクトを作成します。 3) 同じ名前の新しい C# スクリプトを作成し、オブジェクトに追加します。-生成されたスクリプトに、あらかじめ決められた「キャラクター テンプレート」コードを含めたい。4) 新しいスクリプトを新しい空のゲーム オブジェクトにアタッチし、「キャラクター スクリプト」もアタッチします。

前もって感謝します。

最後のサブ質問です。Character Script の public monobehavior によって GameController から PlayerNamedScript にアクセスするほうがよいでしょうか?

または、CharacterScript は PlayerNamedScript 兄弟を動的に拡張できますか。

それが明確であることを願っています。再度、感謝します。

4

2 に答える 2

0

私のスクリプトは、Venkat の回答のように本番環境に対応していませんが、教育目的では理解しやすいはずです。

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

使用法:

  1. このスクリプトをシーン上の任意のオブジェクトに追加します。
  2. インスペクターで追加したばかりのコンポーネントを右クリックします。
  3. 「キャラクター作成」を選択。
  4. 数秒待ちます。
于 2015-01-06T20:09:42.793 に答える