私の小さな2Dゲームでプレイヤーの相続に少し助けが必要です。 実際、新しいプレーヤーを作成してリストに追加する方法がわかりません。Unity 2Dプロジェクトの構造:スクリプトに基づいてPlayerを動的に作成する方法
あなたが見ることができるように、私のスクリプトでは、私はGameBaseスクリプトを持っている、とPlayerBaseスクリプトPlayerLife、PlayerControllerとPlayerAimManagerとPlayerBaseの子として。
私のプレハブには、私のカメラにはGameBaseスクリプト、PlayerPrefabにはプレイヤースクリプトがあります。
マイPlayerBaseが...スクリプトの魔女は彼の人生、スピード、色などのように、プレイヤーを定義している:
public class PlayerBase : MonoBehaviour
{
public int Id { get; set; }
public string Name { get; set; }
protected float Life { get; set; }
public Color Color { get; set; }
protected WeaponBase PrimaryWeapon { get; set; }
protected WeaponBase SecondaryWeapon { get; set; }
protected WeaponBase SelectedWeapon { get; set; }
protected ScoreBase Score { get; set; }
protected bool IsDead { get; set; }
protected float Speed { get; set; }
protected float JumpForce { get; set; }
protected virtual void Start()
{
IsDead = false;
//Reset rotation
transform.rotation = Quaternion.identity;
Life = 100;
Speed = 20;
JumpForce = 4000;
PrimaryWeapon = gameObject.AddComponent<SMG>();
SecondaryWeapon = gameObject.AddComponent<Shotgun>();
SelectedWeapon = PrimaryWeapon;
}
}
(そして、私の子供がこのように動作します:)
public class PlayerLife : PlayerBase
{
// Use this for initialization
protected override void Start()
{
base.Start();
var color = base.Color();
}
}
[OK]をこれは私の問題です:
新しいプレーヤーをインスタンス化してリストに保存するにはどうすればよいですか?私GameBaseで
私はこのような何か:
public class GameBase : MonoBehaviour
{
public List<PlayerBase> Players { get; set; }
void Start()
{
var playerObj1 = Instantiate(Resources.Load("Prefabs/Players/PlayerPrefab")) as GameObject;
PlayerBase player1 = playerObj1.GetComponent<PlayerBase>();
player1.Color = Color.red;
player1.Name = "Naografix Red";
var playerObj2 = Instantiate(Resources.Load("Prefabs/Players/PlayerPrefab")) as GameObject;
PlayerBase player2 = playerObj2.GetComponent<PlayerBase>();
player2.Color = Color.blue;
player2.Name = "Foo Blue";
Players = new List<PlayerBase>{
player1,
player2
}
}
}
私はこれを行う場合は、静的ではないので、私の子供のプレイヤースクリプトの私の色は私の色を表示できません。しかし、私がColorを静的な小道具に置くと、自分の色を私のGameBaseで変更することはできません。
私の相続が良いかどうかわかりません。
自分の変数を取得するために、PlayerBaseに基づく子スクリプトを使用して動的にプレーヤーを作成したいだけです。
EDIT
実際に、私は私が動的にカスタムプロパティを持つプレーヤーを作成することができるのか分かりません。 私はこれをしたい:
PlayerBase player1 = new PlayerBase();
player1.Name = "Nao";
player.Color = Color.Red;
をそして、私のPlayerListに保管してください。しかし、私はこれを行うことはできません。なぜなら、プレハブは作られていないからです。
私はPlayerPrefabで新しいGameObjectをインスタンス化します。 - クール、私のプレーヤーが産んだ、私はいくつかのプロパティを適用するつもりです。ハァッ? PlayerBaseスクリプトはどのように入手できますか?
次に、GetComponentを使用してPlayerBaseを取得しますが、私の子供がいるためPlayerBaseは取得できません(私はPlayerPaseをPlayerPrefabに持っていません)。 PlayerBaseを置くと、すべての子はそれぞれPlayerBaseのインスタンスが異なります。
結論:PlayerBaseに基づいて新しいPlayerを作成し、すべてのプロパティを自分の子に共有し、プロパティでPlayerPrefabを生成するにはどうすればよいですか?簡単な例では
ENDEDIT
EDIT
public class Game : MonoBehaviour
{
private List<PlayerBase> _players;
public GameObject Player;
void Start() {
_players = new List<PlayerBase>();
var obj = Instantiate(Player);
var playerBase = obj.GetComponent<PlayerBase>();
playerBase.Color = Color.blue;
}
void Update() {
}
}
public class PlayerBase : MonoBehaviour {
public Color Color { get; set; }
// Use this for initialization
protected virtual void Start() {
gameObject.GetComponent<Renderer>().material.SetColor("_Color", Color);
}
// Update is called once per frame
protected virtual void Update() {
}
}
public class PlayerLife : PlayerBase {
// Use this for initialization
protected override void Start() {
gameObject.GetComponent<Renderer>().material.SetColor("_Color", Color);
}
// Update is called once per frame
void Update() {
}
}
マイplayerLife色はnullです。これが私の最初の問題です。
ENDEDIT
あなたは詳細が必要な場合は掲載していません。あなたはMonoBehaviourの公共メンバー(ないプロパティ)を定義するとき
おかげ
しかし...カラーカラーに名前を付ける、あなたはそれを変更したい場合があります。それが失敗する理由さえあります。 – Everts