Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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# 尝试使用getcomponent访问基类_C#_Unity3d - Fatal编程技术网

C# 尝试使用getcomponent访问基类

C# 尝试使用getcomponent访问基类,c#,unity3d,C#,Unity3d,我有一个非常奇怪的问题,类B和C都继承自类a 基本上,当B处理敌人和C处理可摧毁物体时,A类A处理生命点和伤害 我的播放机使用Raycast检查B或C类,方法是检查GetComponent()是否返回空值。然后,它可以使用A类应用损坏 它运行良好,直到B类(敌人)发动攻击。然后GetComponent()开始返回null 我的脚本非常混乱和复杂,所以我想知道它是否来自GetComponent()。我是说,C#不是有多态性吗 添加代码 下面是我的主类(类A)中的方法TakeDamage(): 以

我有一个非常奇怪的问题,类
B
C
都继承自类
a

基本上,当
B
处理敌人和
C
处理可摧毁物体时,A类
A
处理生命点和伤害

我的播放机使用
Raycast
检查
B
C
类,方法是检查
GetComponent()
是否返回空值。然后,它可以使用
A
类应用损坏

它运行良好,直到B类(敌人)发动攻击。然后
GetComponent()
开始返回null

我的脚本非常混乱和复杂,所以我想知道它是否来自
GetComponent()
。我是说,C#不是有多态性吗


添加代码 下面是我的主类(类A)中的方法
TakeDamage()

以下是附加到武器的脚本,该武器试图访问父方法:

void Fire()
{
    if(_actualBulletCount > 0 && _shotCounter < 0 && !isRunning && !isReloading)
    {
        flash.Play();
        _audioSource.Play();
        _anim.SetTrigger("fire");
        _actualBulletCount--;
        _shotCounter = _delayBetweenTwoShots;

        RaycastHit hit;
        Debug.DrawRay(_bulletSpawn.position, _bulletSpawn.TransformDirection(Vector3.forward) * 50f, Color.yellow);
        if (Physics.Raycast(_bulletSpawn.position, _bulletSpawn.TransformDirection(Vector3.forward), out hit, Mathf.Infinity))
        {
            Debug.Log("Did Hit");
            HandleHit(hit);
        }
    }
    printUI();
}

void HandleHit(RaycastHit hit)
{
    Debug.Log(hit.transform.GetComponent<HittableEntity>());
    hit.transform.GetComponent<HittableEntity>().TakeDamage(_damagePerHit,hit);
}
void Fire()
{
如果(_actualBulletCount>0&&&_shotCounter<0&&!正在运行&&!正在加载)
{
flash.Play();
_audioSource.Play();
_动画设置触发(“火灾”);
_实际BulletCount--;
_快照计数器=\u两次快照之间的延迟;
雷卡斯特击中;
Debug.DrawRay(_bulletpawn.position,_bulletpawn.TransformDirection(Vector3.forward)*50f,Color.yellow);
if(Physics.Raycast(_bulletSpawn.position,_bulletSpawn.TransformDirection(Vector3.forward),out hit,Mathf.Infinity))
{
Log(“Did Hit”);
HandleHit(hit);
}
}
printUI();
}
无效手击(射线击)
{
Log(hit.transform.GetComponent());
hit.transform.GetComponent().TakeDamage(_damagePerHit,hit);
}
C#继承并不构成一个统一的
组件
。如果要访问继承的类,则需要将重写的方法设置为
virtual

C#多态性 单位成分 如果您更愿意使用Unity的内置
组件
系统,请参阅以下内容

给定:同一个
游戏对象上有多个脚本

public class A
{
    public int TakeDamage(int damageTaken) { ... }
}

public class B
{
    public int AnotherMethod(int damage)
    {
        gameObject.GetComponent<A>().TakeDamage(damage);
    }
}
公共A类
{
公共内部损坏(内部损坏){…}
}
公共B级
{
公共国际法(国际损害)
{
gameObject.GetComponent().TakeDamage(伤害);
}
}
C#继承并不构成一个统一的
组件
。如果要访问继承的类,则需要将重写的方法设置为
virtual

C#多态性 单位成分 如果您更愿意使用Unity的内置
组件
系统,请参阅以下内容

给定:同一个
游戏对象上有多个脚本

public class A
{
    public int TakeDamage(int damageTaken) { ... }
}

public class B
{
    public int AnotherMethod(int damage)
    {
        gameObject.GetComponent<A>().TakeDamage(damage);
    }
}
公共A类
{
公共内部损坏(内部损坏){…}
}
公共B级
{
公共国际法(国际损害)
{
gameObject.GetComponent().TakeDamage(伤害);
}
}

我在想为什么需要调用A来执行TakeDamage方法,您可以调用B或C并调用TakeDamage方法,因为它是由B和C继承的

hit.transform.GetComponent<B>().TakeDamage(_damagePerHit, hit);
hit.transform.GetComponent().TakeDamage(\u damagePerHit,hit);

我在想为什么需要调用A来执行TakeDamage方法,您可以调用B或C并调用TakeDamage方法,因为它是由B和C继承的

hit.transform.GetComponent<B>().TakeDamage(_damagePerHit, hit);
hit.transform.GetComponent().TakeDamage(\u damagePerHit,hit);

C#具有多态性,我知道。这是我在你的帖子里能找到的唯一真实的问题。其余部分只是抽象地描述了一些您尚未发布的代码。如果唯一带问号的部分是修辞性的,恐怕没有人能真正回答。对不起。我想问的是,使用GetComponent()是否是实现我所希望的目标的好方法。在检查器中,您试图获取组件的对象会发生什么情况?组件是否仍然存在?另外,请您按照其他人的建议给出一些代码。组件没有理由开始无缘无故地返回null,所以您一定做了一些事情,但我们看不到,因为您没有什么要显示的。C#has polymorphismI知道。这是我在你的帖子里能找到的唯一真实的问题。其余部分只是抽象地描述了一些您尚未发布的代码。如果唯一带问号的部分是修辞性的,恐怕没有人能真正回答。对不起。我想问的是,使用GetComponent()是否是实现我所希望的目标的好方法。在检查器中,您试图获取组件的对象会发生什么情况?组件是否仍然存在?另外,请您按照其他人的建议给出一些代码。组件没有理由开始无缘无故地返回null,因此您一定做了一些事情,但我们看不到,因为您没有任何东西可以显示。我目前正在使用第二种方法,在敌人攻击我之前,wich工作正常。我发布了一些代码,你应该使用
组件
系统,因为这是系统的一个优势,而不必将你的代码硬塞进继承中。我目前使用的是第二种方法,在敌人攻击我之前,它工作得很好。我在发布一些代码,你应该使用
组件
系统,因为它是系统的一个优势,而不必将代码硬塞进继承中。是的,但正如你在我的HandleHit中看到的,它必须与B或C一起工作,这就是为什么我需要将hit转换为a。我甚至可能创建其他类D,E继承自a……正如之前有人已经回答过的,在这种情况下,您可以使用多态性。这比选择每个对象在其上实例化一个组件更容易。是的,但正如你在我的HandleHit中看到的,它必须与B或C一起工作,这就是为什么我需要将hit转换为a.i
hit.transform.GetComponent<B>().TakeDamage(_damagePerHit, hit);