Мне нужна небольшая помощь для моего наследования моего игрока в моей маленькой 2D-игре. На самом деле, я не знаю, как я могу создать нового игрока и добавить его в список.Структура проекта Unity 2D: Как создать проигрыватель динамически на основе сценария
Как вы можете видеть, в моем сценарии, у меня есть 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 цвет является пустым. Это моя первая проблема.
EndEdit
Спросите меня, если вы хотите больше деталей.
Благодаря
Это именование хотя ... цвет цвет, вы можете изменить это. Это может быть даже причина, по которой она терпит неудачу. – Everts