【问题标题】:How to access a method of a child class in c#?如何在c#中访问子类的方法?
【发布时间】:2014-05-02 15:28:29
【问题描述】:

当它返回某个类... 的实例时,我需要访问gameObject.AddComponent()essential 参数

gameObject.AddComponent() 函数的返回类型为 Component

项目中的继承看起来是这样的:

Object <- Component <- Behaviour <- MonoBehaviour <- TDefault <- ...

其中AB 表示“B 继承自 A”。

我无权访问MonoBehaviour 或其父母。它们由引擎提供。

TDefault 是我继承除TEssential 之外的所有类的类。它是我写的。它具有essential 类型的TEssential 属性

铸造print(gameObject.AddComponent(effect_name) as TDefault); 打印null

print((gameObject.AddComponent(effect_name) as dynamic));

生产

内部编译器错误。有关更多信息,请参阅控制台日志。 输出为:错误 CS0518:预定义类型 System.Runtime.CompilerServices.CallSite 未定义或导入 错误 CS0518:预定义类型 System.Runtime.CompilerServices.CallSite 1' 未定义或导入

我尝试添加

using System.Runtime.CompilerServices.CallSite;

但它只会改变错误

内部编译器错误。有关更多信息,请参阅控制台日志。输出为:错误 CS0518:预定义类型 System.Runtime.CompilerServices.CallSite' is not defined or imported error CS0518: The predefined typeSystem.Runtime.CompilerServices.CallSite`1' 未定义或导入

我确定返回的变量的类型为...。内置编辑器正确显示。

如何获得房产?

【问题讨论】:

  • 什么是print()?你怎么知道AddComponent() 的返回值是TDefault?你从gameObject.AddComponent(effect_name).GetType().ToString()得到什么?
  • 我得到了 int_param,这是我从 TDefault 手动继承的类型。打印();由引擎功能内置用于调试。如果我没记错的话,它只是调用 Debug.Log()

标签: c#


【解决方案1】:

添加组件具有通用重载,因此您应该能够做到:

effect_name newComponent = gameObject.AddComponent<effect_name>();

经过更多研究。你确定effect_name 继承了TDefault

【讨论】:

  • AddComponent 的通用版本不接受类型参数。我只能调用 AddComponent() 来创建新的 TDefault
  • 我从来没有说过effect_name 继承了TDefault。它是一个字符串,它指定类的名称,我要添加的实例。
【解决方案2】:

如果您想访问附加到游戏对象(是否为子对象)的类(或组件)的方法,可以使用gameObject.GetComponent&lt;Myclass(or component)&gt;().MyMethod([params])

如果你想访问一个游戏的孩子object -&gt; gameobject.Transform.getChild(#)

如果要添加组件,请使用AddComponent 方法。

【讨论】:

  • 我想添加一个组件。此外,我想要一个对该组件的属性的引用。在添加之前我不能使用 GetComponent()。添加后如何与其他同类型的组件区分开来?
  • 我从来没有在同一个游戏对象中拥有更多相同类型的组件,我使用第三个游戏对象来管理麻烦的项目,或者我更改/使用/修改游戏对象上的当前组件,仍然,没有确定哪种组件需要两个相同类型的组件。祝你好运
【解决方案3】:

解决方案是 Casting to Interface:

1)

    using UnityEngine;
    using System.Collections;
    using NExtensionMethods;

    public class TDefault:MonoBehaviour,IDefault
    {
        public  TEssentail essential=new TEssentail();
        public TEssentail get_essential()
        {
            if(essential==null)
                essential=new TEssentail();
            return essential;
        }

        public TDefault ()
        {
        }
    }

2)

using UnityEngine;
using System.Collections;

public interface IDefault
{

    TEssentail get_essential();
}

3)TEssentail ess=(gameObject.AddComponent(effect_name) as IDefault).get_essential();

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 1970-01-01
    • 2017-09-22
    • 2013-03-14
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2012-12-21
    相关资源
    最近更新 更多