课堂上的GameObject? Unity3D

时间:2015-09-30 12:53:59

标签: unity3d

我在塔防中间 - 使用C#在Unity中开发风格。 所以,我有一个塔的抽象类,有一个范围的int,火的速度等。 然后我为不同类型的塔提供了一些子课程。 我怀疑塔类中是否有类型GameObject的属性,其中包含塔式游戏对象本身(用于产生射弹,如果需要则移动塔)或者具有属性的类,然后具有控制器的控制器塔类属性并控制游戏对象本身(当需要移动它,设置活动与否时等)。

我希望我清楚自己! 谢谢!

修改

我不确定哪个选项会更好。

选项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);}
     }
}

我现在希望它更清楚了!

谢谢!

2 个答案:

答案 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--;

答案 1 :(得分:1)

我假设每个塔都有不同的模型/材料,因此我会通过附加到每个预制件的MonoBehavior派生脚本(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工作流程,允许通过UI进行编辑,并在需要时由实例覆盖。

因此,无论是选项1还是选项2,都更接近于没有类继承的选项2,以及更多的Unity-conventional。

以下是TowerController的示例实现,允许设置attackRate和射弹预制件(因此您可以通过UI设置每种塔型的不同版本):

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.
    }
}