[解決済み] コンストラクターによるスクリプト可能なオブジェクト・インスタンスの作成
質問
キャラクターのスクリプト可能なオブジェクトがあり、その中にいくつかのメソッドを持っています。GetDateやGetAgeのようなものです(ここでは表示していません)。そこにコンストラクタを作成しましたが、コンストラクタを通じてそのScriptableObjectのインスタンスを作成する方法がわかりません。それは私がやりたいことです。
インスペクタに値だけを入力しようとしましたが、それではコンストラクタのメソッドが実行されません。
キャラクター.cs
[CreateAssetMenu]
[Serializable]
public class Character : Scriptable Object
{
// Attributes
public string firstName;
public string middleName;
public string lastName;
public string fullName;
public bool isMale;
// Constructor
public Character(string _firstName, string _middleName, string _lastName, bool _isMale)
{
firstName = _firstName;
middleName = _middleName;
lastName = _lastName;
// All The Functions
fullName = string.Format("{0} {1} {2}", firstName, middleName,
lastName);
isMale = _isMale;
// and all the other functions like date calculator.
}
}
このConstructionによって、このScriptable Objectのインスタンスを作りたいのです。以下のような感じ。
Character char("x", "y", "z", true);
とか、Unity Inspectorに必須項目を入力すると、そのフルネームのようなメソッドが全て実行されます。
string.format
.
解決方法は?
いいえ、そんなことはありません。なぜ
ScriptableObject
s
の代わりに、単純なクラス (
私たちはこの質問から来ました
そこで、例えばインスペクタで文字列を設定するか、あるいは以下のような方法で文字列を設定します。
new Character("abc", "xyz", "kfk", true);
しかし、例えば次のようなファクトリーメソッドを用意することができます。
[CreateAssetMenu]
[Serializable]
public class Character : Scriptable Object
{
// Attributes
public string firstName;
public string middleName;
public string lastName;
public string fullName;
public bool isMale;
// Constructor
private void Init(string _firstName, string _middleName, string _lastName, bool _isMale)
{
firstName = _firstName;
middleName = _middleName;
lastName = _lastName;
// All The Functions
fullName = string.Format("{0} {1} {2}", firstName, middleName, lastName);
isMale = _isMale;
// and all the other functions like date calculator.
}
public static Character CreateCharacter(string firstName, string middleName, string lastName, bool isMale)
{
var character = ScriptableObject.CreateInstance<Character>();
character.Init(firstName, middleName, lastName, isMale);
}
}
または、例えば、次のようにします。
private void OnEnable()
{
fullName = $"{firstName} {middleName} {lastName}";
}
というように、ゲーム開始時に存在するようにします。
どうしても欲しい場合
間に
インスペクターにこれらの名前を入力すると
カスタムインスペクター
を実装することで
Editor
#if UNITY_EDITOR
using UnityEditor;
#endif
public class Character : Scriptable Object
{
...
}
#if UNITY_EDITOR
[CustomEditor(typeof(Character))]
public class CharacterEditor : Editor
{
private SerializedProperty firstName;
private SerializedProperty middleName;
private SerializedProperty lastName;
private SerializedProperty fullName;
// called once when the Object of this type gains focus and is shown in the Inspector
private void OnEnable()
{
firstName = serializedObject.FindProperty("firstName");
middleName= serializedObject.FindProperty("middleName");
lastName= serializedObject.FindProperty("lastName");
fullName= serializedObject.FindProperty("fullName");
}
// kind of like the Update method of the Inspector
public override void OnInspectorGUI()
{
// draw the default inspector
base.OnInspectorGUI();
serializedObject.Update();
fullName.stringValue = $"{firstName.stringValue} {middleName.stringValue} {lastName.stringValue}";
serializedObject.ApplyModifiedProperties();
}
}
#endif
を使用する代わりに
#if UNITY_EDITOR
もちろん
CharacterEditor
という名前のフォルダーに置いてください。
Editor
. どちらの場合も、ビルドの際にそれに応じたコードが取り除かれます。
関連
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] List<T>をオブジェクトのプロパティでソートする方法
-
[解決済み] コンストラクタ内の仮想メンバー呼び出し
-
[解決済み] あるコンストラクタを別のコンストラクタから呼び出す
-
[解決済み] Typeから新しいオブジェクトのインスタンスを作成する方法
-
[解決済み】TをEnumに拘束するGenericメソッドの作成
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?