<blockquote>
<p>For reference, here is the code I am testing:</p>
</blockquote>
<p>这里有很多错误。你一直在运行Lua脚本;这就是为什么它总是被重置的原因。另一个问题是您的脚本正在创建一个<em>全局</em>函数,因此每次运行它时,都会得到一个<em>新的</em>全局函数,它使用一个<em>new</em><code>local</code>变量。在</p>
<p>停止使用全局变量。每个NPC都是一个独立的对象。因此,它需要有对象特定的数据。在</p>
<pre><code>behavior = "testBehavior.lua";
luaL_dofile(luaState, behavior);
</code></pre>
<p>这不会创建任何特定于对象的数据。它只是运行一个Lua脚本并完全丢弃所有返回值。除非该脚本实际全局存储特定于对象的内容,否则不会创建任何特定于对象的数据。在</p>
<p>Lua脚本需要做的是返回一个表,该表包含脚本需要的对象特定数据。脚本应该如下所示:</p>
^{pr2}$
<>你的C++代码需要在NPC类中使用EM>Stury<EEM >表,然后使用它。这很容易通过Luabind调用完成。您的构造函数应该如下所示:</p>
<pre class="lang-c++ prettyprint-override"><code>NPC::NPC(lua_State* L)
{
behavior = "testBehavior.lua";
int err = luaL_loadfile(L, behavior);
//Handle compiler errors. DON'T FORGET THIS!
luabind::object func = luabind::from_stack(L, -1);
lua_pop(L, 1);
luaData = func(); //Catch exceptions for runtime errors
lua_pop(L, 1);
}
</code></pre>
<p>您的类中没有<code>lua_State* luaState</code>,而是在类中保留一个<code>luabind::object luaData</code>。如果您需要<code>lua_State</code>,您可以随时从<code>luabind::object</code>获得一个。在</p>
<p>要调用Lua <code>onHit</code>函数,只需使用<code>luabind::object</code>接口:</p>
<pre class="lang-c++ prettyprint-override"><code>void NPC::onHit()
{
luaData["onHit"](luaData);
}
</code></pre>
<p>请注意,不要重新运行Lua脚本。这就是你的问题所在。你只是在调用一个Lua脚本已经定义的函数。在</p>
<p>现在,您似乎希望使用局部变量而不是表内存。这很好,它将阻止C++代码直接访问^ {< CD8}}(不是没有欺骗)。{{cd6>我们必须简化代码。你可以在Lua中用这个:</p>
<pre><code>local health = 10
local NPC = {}
function NPC.onHit()
health = health - 5
end
return NPC
</code></pre>
<p>{NPC>不需要改变构造函数。在</p>
<pre class="lang-c++ prettyprint-override"><code>void NPC::onHit()
{
luaData["onHit"]();
}
</code></pre>
<p>如果你一意孤行地使用全局变量,你可以和环境玩游戏,但这相当复杂。它将在各个脚本调用之间提供有保证的隔离。在</p>