2015-09-30 3 views
0

im in the middle of Tower Defense - стиль, развивающийся в Unity с использованием C#. Итак, у меня есть абстрактный класс для башен, у которых есть int для диапазона, скорость стрельбы и т. Д. А потом у меня есть несколько дочерних классов для разных типов башен. Я сомневаюсь, что у меня есть атрибут типа GameObject в классе башни, который содержит сам объект игры Tower (для нереста снаряда, если нужно, переместите башню) или с классом с атрибутами, а затем с контроллером, который управляет атрибуты класса башни, а также контролирует сам игровой объект (когда нужно его перемещать, устанавливать активно или нет и т. д.).GameObject в классе? Unity3D

Хотелось бы, чтобы я поняла! Спасибо!

EDIT

Я не уверен, что вариант которым будет лучше.


Вариант 1:

public abstract class Tower{ 
     private int health; 
     ... 
     private GameObject object; 

     public HealthDown(){ 
      if(health >1){ health -= 1;} 
      else { object.SetActive(false);} 
     } 
} 

Вариант 2:

public abstract class Tower{ 
     private int health; 
     ... 

     public HealthDown(){ 
      if(health >1){ health -= 1;} 
     } 
} 

А потом сценарий, который контролирующая башни:

public class Controller : MonoBehaviour { 

    Tower tower; 
    ... 
    void Update(){ 
     if(tower.health <= 1){this.gameObject.SetActive(false);} 
    } 
} 

Я хочу, чтобы это было более ясно!

Спасибо!

+0

Как 'object' разных из 'gameObject'? – Droppy

+0

объект такой же, как gameObject. В первом варианте я получаю объект от конструктора класса Tower. Во втором варианте я получаю gameObject из скрипта, который будет прикреплен к самому gameObjectу –

ответ

1

Я предполагаю, что у вас есть различные модели/материалы для каждой башни, и поэтому я бы параметризовать эти различные скорости атаки и т.д. через MonoBehavior -derived скрипт (TowerController.cs) прилагается к каждому сборный:

Tower1 prefab: 
    Model = tower 
    Material = tower1 
    Script = TowerController.cs 
     attackRate = 10 
     projectilePrefab = projectile1 

Tower2 prefab: 
    Model = tower 
    Material = tower2 
    Script = TowerController.cs 
     attackRate = 20 
     projectilePrefab = projectile2 

Это следует нормальный рабочий процесс Unity и позволяет редактировать через пользовательский интерфейс и быть переопределены случаях, если это необходимо.

Таким образом, ни Вариант 1, ни Вариант 2, но ближе к Варианту 2 без наследования классов и более Unity-обычные.

Вот пример реализация TowerController позволяет attackRate и снаряд префабу быть установлен (так что вы можете иметь различные версии для каждого типа башни, установленный с помощью пользовательского интерфейса):

using UnityEngine; 
using System.Collections; 

public class TowerController: MonoBehaviour 
{ 
    public int health = 50; 
    public int attackRate = 10; 
    public GameObject projectilePrefab; 

    public void TakeDamage(int damage) 
    { 
     health -= damage; 
     if (health <= 0) { 
      gameObject.SetActive(false); 
     } 
    } 

    private void FireProjectile() 
    { 
     GameObject projectile = Instantiate(projectilePrefab, transform.position, transform.rotation) as GameObject; 
     projectile.transform.SetParent(transform.parent, true); 
     // Add force etc. 
    } 
} 
+0

Спасибо за ваш ответ! Где этот параметр attackRate будет определен? И если я хотел создать метод FireProjectile(), как я могу определить один метод для разных типов башен? –

+0

@FaustoSanchez Каковы различные типы поведения FireProjectile() 'для каждого типа башни? – Droppy

+0

Мне жаль, я не сделал свой собственный ясный, мне нужен только один метод для всех башен. И тогда вы могли бы привести мне пример того, как использовать эту реализацию? Спасибо чувак! –

1
public class Tower : MonoBehaviour { 
    private int health; 
    public int Health 
    { 
     get { return health; } 
     set { SetHealth(value); } 
    } 
    ... 

    public SetHealth(int value){ 
     health = Math.Max(value, 0); 
     gameObject.SetActive(health > 1); 
    } 
} 

Использование:

Tower tower1 = GameObject.Find("Tower1").GetComponent<Tower>(); 

// Attack tower 1 
tower1.Health--; 
Смежные вопросы