Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Heritage,子变量不起作用_C#_Unity3d - Fatal编程技术网

C# Heritage,子变量不起作用

C# Heritage,子变量不起作用,c#,unity3d,C#,Unity3d,这个问题是关于统一的,但我认为我只是做了c方面的错误 编辑 看起来,通过编写代码并存储父类a的子类B,通过说是类a类型,通过修改包含类B的a类变量,我修改了某种混合类a/B,它不代表我真正的类B脚本 我要做的是,在不同的预置上有多个脚本。这些脚本中的每一个都代表一个项目,并且都有可用的父类,这是一个我实际使用的类,就像一个接口一样,但这将在将来得到一些东西 完整的武器激光和可用脚本如下 当玩家经过一个放置点时,我实例化包含如下脚本的游戏对象(使用预置) 问题是,看起来我使用()时调用的脚本是另一

这个问题是关于统一的,但我认为我只是做了c方面的错误

编辑

看起来,通过编写代码并存储父类a的子类B,通过说是类a类型,通过修改包含类B的a类变量,我修改了某种混合类a/B,它不代表我真正的类B脚本

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

完整的
武器激光
可用
脚本如下

当玩家经过一个放置点时,我实例化包含如下脚本的游戏对象(使用预置)

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

我的意思是,如果我设置
intfirecurrentshoot=10在脚本WeaponLaser的顶部,然后在开始时使用trought代码,例如I do
FireCurrentShot=2

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

    if (usableItem != null)
    usableItem.Use(firePoint.position);
它将显示
FireCurrentShot=10
so,无需修改

结束编辑

你好,

我对传统有一个问题,我不明白,我打扫了所有的课,但我仍然找不到原因

我有一个甲级:

 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);
usableItem=droppedItem.GetComponent();
usableItem.Use(火点位置);

为什么他等于0?

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

  • 确保启动被称为:我认为这是你的情况,因为 您说您看到了调试打印,但请记住,并没有调用Start 在编辑器中禁用的对象上,因此某些值 您在“开始”中的设置将不会被初始化

  • 在unity editor中使用唯一的名称命名对象,并在调试中添加该名称

    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上设置调试点以查看调用堆栈

编辑:

我想我明白了:你不是注册到实例化对象,而是注册到你的预置

替换

usableItem = droppedItem.GetComponent<Usable>();
usableItem=droppedItem.GetComponent();

usableItem=Item.GetComponent();

我怀疑问题是否是继承造成的。看起来您在某个点覆盖了该值,或者只剩下初始值。您何时使用
Start
?我不明白您为什么期望值为
5
。初始值是
0
为什么它应该是
5
?您没有调用
Start
-因此
FireCurrentShot
的值没有更新为5。在Unity中,引擎默认调用Start,因此它被调用,调试确实显示值@MongZhuMy猜测是有东西正在创建另一个实例。添加一个显式的无参数构造函数,并在其中添加一些日志记录。当您在设置值之前调用debug.log时,start方法中的debug.log怎么可能给出5?在你的例子中,你混合了两行吗?你好,我没有考虑财产的事情,事实上它帮助了我。我认为我的失败在于我如何处理统一的对象。我将用我看到的编辑内容编辑我的主要问题,但是你确定你写了什么吗?你说在开始时你设置FireCurrentShot=2,然后你看到值是2。。。所以这看起来像是通缉犯是的,再次抱歉。。。我很糟糕,我得到了帮助,因为我不清楚,并且在寻求帮助时犯了错误——基本上是的,基本脚本的值是我从代码外部捕获的值(所以当我调用Use时),我在脚本内部修改的值是我从代码内部获得的值。我希望它们是一样的。但我明白,要理解或找到这样的解决方案是相当混乱的,所以我想我会找到其他方法来解决doDon。不要抱歉,你仍然提供了比这里的许多人更有用的信息。话虽如此,我还是用我注意到的最后一件可能解决问题的东西编辑了我的答案。好的luckOMGOMG一直以来,我都想重做,因为我知道这是一个小错误,我永远找不到xD好眼睛的人,非常感谢你!
int _fireCurrentShoot = 0;
private int fireCurrentShoot
{
    get{ return _fireCurrentShoot;}
    set{ _fireCurrentShoot = value; Debug.log("fireCurrentShot set to " + _fireCurrentShoot);}
}
usableItem = droppedItem.GetComponent<Usable>();
usableItem = Item.GetComponent<Usable>();