2016-12-27 6 views
2

Мне нужна небольшая помощь для моего наследования моего игрока в моей маленькой 2D-игре. На самом деле, я не знаю, как я могу создать нового игрока и добавить его в список.Структура проекта Unity 2D: Как создать проигрыватель динамически на основе сценария

Это моя структура проекта: enter image description here

Как вы можете видеть, в моем сценарии, у меня есть 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 в static prop, я не могу изменить свой цвет в своей GameBase.

Ну, я не знаю, хорошо ли мое наследство или нет.

Я просто хочу создать плеер динамически с помощью дочернего скрипта на основе PlayerBase, чтобы получить его собственную переменную.

EDIT

На самом деле, я не знаю, как я могу создать динамически игрока с пользовательскими свойствами. Я хочу, чтобы это сделать:

PlayerBase player1 = new PlayerBase(); 
player1.Name = "Nao"; 
player.Color = Color.Red; 

И хранить его в моем PlayerList. Но я не могу этого сделать, потому что никакой сборник не создается.

Так что я создаю новый GameObject с помощью своего PlayerPrefab. -Ок, круто, мой игрок порожден, я собираюсь применить некоторые свойства. А? Как я могу получить свой скрипт PlayerBase?

Затем я получаю свой PlayerBase с GetComponent, но все еще не работаю, потому что у меня есть мой ребенок (у меня нет PlayerBase на моем PlayerPrefab). И если я ставлю на него PlayerBase, у каждого ребенка будет другой экземпляр моей PlayerBase.

В заключение: Как создать новый плеер на основе PlayerBase, поделиться всеми свойствами с моими дочерними элементами и создать игровые объекты 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 цвет является пустым. Это моя первая проблема.

enter image description here

EndEdit

Спросите меня, если вы хотите больше деталей.

Благодаря

+0

Это именование хотя ... цвет цвет, вы можете изменить это. Это может быть даже причина, по которой она терпит неудачу. – Everts

ответ

2

При определении общественного члена (не собственность) в MonoBehaviour, значение, установленное инспектор автоматически сериализованное для этой игры объекта. Таким образом, когда вы создаете экземпляр из этого игрового объекта, он автоматически восстанавливается в экземплярный игровой объект.

Это также может быть сделано без public аксессуар и с атрибутом [SerializeField].

Убедитесь, что только ваш код PlayerLife наследует от PlayerBase. Остальные ваши скрипты (PlayerController и PlayerAimManager) должны наследоваться от MonoBehaviour.

Как для вашей проблемы с цветом, она не отображается, потому что, когда вы делаете player2.Color = Color.blue;, вы изменяете struct, который является копией, а не ссылкой. Вы должны вручную назначить этот цвет gameObject.GetComponent<Renderer>().material.SetColor.

Ваш новый PlayerBase сценарий:

public class PlayerBase : MonoBehaviour 
{ 
    public Color Color; 

    public Color matColor 
    { 
     get 
     { 
      Color = gameObject.GetComponent<Renderer>().material.GetColor("_Color"); 
      return Color; 
     } 
     set 
     { 
      Color = value; 
      gameObject.GetComponent<Renderer>().material.SetColor("_Color", Color); 
     } 
    } 


    // Use this for initialization 
    protected virtual void Start() 
    { 
     matColor = Color; 
    } 

    // Update is called once per frame 
    protected virtual void Update() 
    { 

    } 
} 

PlayerLife:

public class PlayerLife : PlayerBase 
{ 
    public PlayerBase pBase; 

    void Awake() 
    { 
     pBase = this; 
    } 

    // Use this for initialization 
    protected override void Start() 
    { 
     matColor = Color; 
    } 

    // Update is called once per frame 
    protected override void Update() 
    { 

    } 
} 

Чтобы использовать его из игры scriot:

public class Game : MonoBehaviour 
{ 
    private List<PlayerLife> _players; 
    public GameObject Player; 

    void Start() 
    { 
     _players = new List<PlayerLife>(); 

     GameObject obj = Instantiate(Player); 
     PlayerLife playerLife = obj.GetComponent<PlayerLife>(); 
     playerLife.matColor = Color.blue; 
     _players.Add(playerLife); 

     GameObject obj2 = Instantiate(Player) as GameObject; 
     PlayerLife playerLife2 = obj2.GetComponent<PlayerLife>(); 
     playerLife2.Color = Color.red; 
     _players.Add(playerLife2); 
    } 

    void Update() 
    { 

    } 
} 

Теперь, если вы решили открыть PlayerBase от вашего PlayerController и PlayerAimManager сценарий,

PlayerBase playerBase = gameObject.GetComponent<PlayerBase>(); 

ИЛИ

PlayerBase playerBase = gameObject.GetComponent<PlayerLife>().pBase; 
+0

Я не знаю, что означает OP под «My color is null». Может быть, он так не появляется в редакторе? Если это так, тогда вы правы в отношении свойства «set {} get {}», поэтому он не отображается в редакторе – Programmer

+0

@Programmer правильно. Я подчеркнул не-свойство, однако я думаю, что OP не знает о сериализации поля так как он автоматически обрабатывается. – Bijan

+0

@Naografix вы имеете в виду добавление статического массива, содержащего все необходимые цвета? – Bijan

 Смежные вопросы

  • Нет связанных вопросов^_^