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