【问题标题】:GameObject in class? Unity3D课堂上的游戏对象? Unity3D
【发布时间】:2016-12-13 23:14:01
【问题描述】:

我正在使用 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);}
     }
}

我希望现在更清楚!

谢谢!

【问题讨论】:

  • objectgameObject 有何不同?
  • 对象与游戏对象相同。在第一个选项中,我将从类 Tower 的构造函数中获取对象。在第二个选项中,我将从脚本中获取游戏对象,控制器将附加到游戏对象本身

标签: unity3d


【解决方案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 常规。

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

【讨论】:

  • 感谢您的回答!将在哪里定义attackRate 参数?如果我想创建一个 FireProjectile() 方法,我该如何为不同类型的塔定义一种方法?
  • @FaustoSanchez 对于每种塔类型,FireProjectile() 的行为有何不同?
  • 对不起,我没有说清楚,我只需要一种方法来处理所有的塔。然后你能给我一个关于如何使用这个实现的例子吗?谢谢大佬!
  • @FaustoSanchez 更新,以便给你一个想法。
  • 对不起,我是stackoverflow的新手,我不知道你的意思。
【解决方案2】:
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--;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多