我在按照正确的方法注册类对象并将类的特定实例传递给脚本的正确方法方面,无法遵循AngelScript手册。假设我有一个想通知AngelScript的C++类Circle

class Circle
{
public:
    int getArea();

    int radius;
};

在这里,我想创建Circle类的实例,将getArea()方法注册到AngelScript引擎(或在可能的情况下自动注册该类中的所有方法),并将类实例本身传递给AngelScript环境。 。
Circle circleInstance;
circleInstance.radius = 10;

// Initialize AngelScript engine

asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION);

engine->RegisterObjectMethod("Circle", "int getArea()",
    asMETHOD(Circle, getArea), asCALL_THISCALL);

在AngelScript中,我希望能够从实例变量中调用方法并返回C++函数的结果。
circleInstance.getArea();

但是,在上面的代码中,我显然没有以任何方式将实例circleInstance传递给AngelScript引擎,因此脚本环境不知道它的存在。我假设我忽略了某些东西,而答案仅是一两行C++。我是否应该通过类似于 Circle RegisterObjectType 的方法注册RegisterInterface类,是否需要让Circle继承 asIScriptObject 才能起作用?任何见解表示赞赏!

最佳答案

首先,您注册Circle对象。

engine->RegisterObjectType("Circle",0, asOBJ_REF); // asOBJ_REF because you wanted a reference call
engine->RegisterObjectBehaviour("Circle", asBEHAVE_ADDREF, "void f()", asMETHOD(Circle, AddRef), asCALL_THISCALL);
engine->RegisterObjectBehaviour("Circle", asBEHAVE_RELEASE, "void f()", asMETHOD(Circle, ReleaseRef), asCALL_THISCALL);

请注意AddRef和ReleaseRef函数。这些是强制性功能,允许Angelscript在需要时从内存中释放它们。您不需要实际地实现它们,就像您在示例中只想使用引用一样。像这样声明
class Circle
{
public:

     void AddRef() { /* do nothing */ }
     void ReleaseRef() { /* do nothing */ }
}

现在注册对象方法。 (您的getArea()函数)
engine->RegisterObjectMethod("Circle", "int getArea()", asMETHOD(Circle, getArea), asCALL_THISCALL); // asCALL_THISCALL means we will call function using myCircle.getArea()

然后注册全局属性(property)。这是您要在angelscript中使用的实例。
engine->RegisterGlobalProperty("Circle myCircle", &CircleInstance);

现在在您的angelscript文件中
 int value = myCircle.getArea(); // remember you registered myCircle as Circle reference

 int radius = myCircle.radius; // error. you need to register each member.

我建议您阅读文档开始完成。对象句柄,引用计数等是您需要掌握的非常重要的概念。

angelscript非常易于嵌入,文档帮助很大。但是当然不会握住你的手。

这是一个较晚的答案,因为我是通过Google找到的。我不想让这个问题没有答案。有人可能会觉得我的答案有用。

10-07 12:29