我在塔防中间 - 使用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);}
}
}
我现在希望它更清楚了!
谢谢!
答案 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.
}
}