遗产,儿童变量不起作用

时间:2018-01-15 07:40:25

标签: c# unity3d

这个问题出在Unity上,但我认为我只是把c#做错了。

编辑

看起来像通过执行代码并存储父类A的子类B,并且通过说是类A类型,通过修改包含类BI的类A类型的变量来修改某种类型的混合类A / B不代表我真正的B类剧本

我所做的是,在不同的预制件上有多个脚本。这些脚本中的每一个都代表一个项目,并且所有脚本都有父Usable,这是一个我实际上像接口一样使用的类,但将来会得到一些东西。

完整的WeaponLaserUsable脚本位于

之下

当玩家超过一滴时,我实例化包含这样的脚本的gameObject(使用预制)

GameObject Item = Instantiate(droppedItem, transform.position, Quaternion.identity);
Item.transform.parent = transform;
usableItem = droppedItem.GetComponent<Usable>();
usableItem.OnUsed += ReleaseItem;

并使用像这样的项目

if (usableItem != null)
    usableItem.Use(firePoint.position);

问题是,当我使用Use()时,它看起来像我调用的脚本是另一个版本。

我的意思是,如果我在脚本WeaponLaser之上设置int fireCurrentShoot = 10;,然后在Start for formplemple中创建代码,我会fireCurrentShoot = 2;

它将在脚本WeaponLaser内部工作,但是当我使用上面的代码调用它时

    if (usableItem != null)
    usableItem.Use(firePoint.position);

如果没有修改,它会显示fireCurrentShoot = 10

结束编辑

您好,

我有遗产问题,我不明白,我清理了所有课程,但我仍然无法找到原因。

我有一个A类:

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

 public class Usable : MonoBehaviour
 {
     protected virtual void Start()
     {
     }

     protected virtual void Update()
     {
     }

     public virtual void Use(Vector3 pos)
     {
     }

     protected virtual void Used()
     {
     }
 }

和B级

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

 public class WeaponLaser : Usable
 {
     const int SHOOT_AVAILABLE = 5;
     const float FIRE_COOLDOWN = 1;
     float fireCurrentCooldown = 0.0f;
     int fireCurrentShoot = 0;

     protected override void Start()
     {
        base.Start();
        Debug.Log("start");
        fireCurrentShoot = SHOOT_AVAILABLE;
        Debug.Log("fireCurrentShoot" + fireCurrentShoot);
     }

     protected override void Update()
     {
         Debug.Log(fireCurrentShoot); // value is = 5
         base.Update();
     }

     public override void Use(Vector3 shootPosition)
     {
         Debug.Log(fireCurrentShoot);// value is = 0
         base.Use(shootPosition);
         base.Used();
     }

     void FireCooldown()
     {

     }
 }

当我调用Use时,我的Debug.Log的booth值为0 ...但是我希望fireCurrentShoot = 5

我称之为*:

    usableItem = droppedItem.GetComponent<Usable>();
usableItem.Use(firePoint.position);

为什么他等于0?

1 个答案:

答案 0 :(得分:2)

您的继承似乎很好,因此问题可能在于您在Unity中使用这些对象的方式。这使得确定解决方案有点困难,但这是你可以尝试的:

  • 确保调用Start:我认为就是这样 你说你看到了调试打印,但请记住没有调用Start 对于在编辑器中停用的对象,所以有些值 你在开始时设置将不会被初始化。

  • 使用唯一名称在Unity编辑器中命名对象,并在调试

    中添加名称
    Debug.Log(fireCurrentShoot + ", " + name);
    

    这可以帮助您确保看到您感兴趣的对象的值

  • 您也可以替换

    int fireCurrentShoot = 0;
    

    由财产:

    int _fireCurrentShoot = 0;
    private int fireCurrentShoot
    {
        get{ return _fireCurrentShoot;}
        set{ _fireCurrentShoot = value; Debug.log("fireCurrentShot set to " + _fireCurrentShoot);}
    }
    

    这将允许您在修改值时看到消息。您 也可以在setter上设置一个调试点来查看callstack

修改

我想我明白了:你没有注册到instanciated对象,而是注册到你的预制件

替换

usableItem = droppedItem.GetComponent<Usable>();

通过

usableItem = Item.GetComponent<Usable>();