这个问题出在Unity上,但我认为我只是把c#做错了。
编辑
看起来像通过执行代码并存储父类A的子类B,并且通过说是类A类型,通过修改包含类BI的类A类型的变量来修改某种类型的混合类A / B不代表我真正的B类剧本
我所做的是,在不同的预制件上有多个脚本。这些脚本中的每一个都代表一个项目,并且所有脚本都有父Usable,这是一个我实际上像接口一样使用的类,但将来会得到一些东西。
完整的WeaponLaser
和Usable
脚本位于
当玩家超过一滴时,我实例化包含这样的脚本的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?
答案 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>();