UE-AIAE案例01-修复Bug和知识点总结
<p>[TOC]</p>
<table>
<thead>
<tr>
<th>作者</th>
<th>QFord</th>
</tr>
</thead>
<tbody>
<tr>
<td>更新日期</td>
<td>2024-6-15</td>
</tr>
</tbody>
</table>
<h1>背景</h1>
<p>此案例来源于<strong>virtual-lab-unreal</strong>项目</p>
<h1>提问1</h1>
<p>@UTransformUtils.h @UTransformUtils.cpp 遇到编译错误,请检查下代码,指出错误
如下图所示:
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=2287387cfa0893d1a80eba177d37a2f5&amp;file=file.png" alt="" /></p>
<h1>回答1</h1>
<p>错误修正
ConvertUnityToUnreal 函数的定义缺少 UUTransformUtils:: 前缀。
ConvertUnityToUnreal 函数的返回值类型应为 FVector,而不是 static FVector。
修正后的代码已经包含在上面的代码块中。</p>
<h1>提问2</h1>
<p>说明下,为什么要这么修正?我试过了,上述的修正是正确的,代码已经通过编译了。</p>
<h1>回答2</h1>
<p>修正的原因如下:</p>
<ul>
<li>缺少类作用域:</li>
</ul>
<p>在 ConvertUnityToUnreal 函数的定义中,缺少了类作用域 UUTransformUtils::。在C++中,类成员函数的定义需要包含类作用域,以便编译器知道该函数属于哪个类。</p>
<ul>
<li>返回类型错误:</li>
</ul>
<p>ConvertUnityToUnreal 函数的返回类型应为 FVector,而不是 static FVector。在函数定义中,static 关键字不应出现在返回类型之前。</p>
<p>头文件中的 static
在头文件中声明静态函数时,static 关键字的作用是将该函数的链接属性设为内部链接。这意味着每个包含该头文件的源文件都会有该函数的一个独立副本。这样做的好处是可以避免不同源文件之间的命名冲突。</p>
<p>为什么不能在源文件中使用 static
在类成员函数的定义中,不能使用 static 关键字,因为类成员函数的静态属性已经在类声明中指定。再次使用 static 关键字会导致语法错误。</p>
<h1>提问3</h1>
<p>请对上述修复的Bug进行总结下,特别突出下UE C++编码的相关知识点</p>
<h1>回答3</h1>
<h3>Bug修复总结</h3>
<p>在修复 UUTransformUtils 类的 ConvertUnityToUnreal 方法时,主要涉及以下两个问题:</p>
<p>1. 缺少类作用域:</p>
<p>在源文件中定义静态成员函数时,必须使用类作用域来指明该函数属于哪个类。否则,编译器无法识别该函数的归属。</p>
<p>2. 返回类型错误:</p>
<p>在函数定义中,static 关键字不应出现在返回类型之前。静态成员函数的静态属性已经在类声明中指定,定义时不需要再次使用 static 关键字。</p>
<h3>修复后的代码</h3>
<p>UTransformUtils.cpp</p>
<pre><code class="language-cpp">FVector UUTransformUtils::ConvertUnityToUnreal(const FVector&amp; UnityVector)
{
// Unity的(x, y, z) -&gt; Unreal的(x, z, -y)
return FVector(UnityVector.Z, UnityVector.X, UnityVector.Y) \* 100.0f;
}</code></pre>
<h3>相关知识点</h3>
<p>1. 类作用域:</p>
<p>在C++中,类成员函数的定义需要包含类作用域,以便编译器知道该函数属于哪个类。例如:</p>
<p> FVector UUTransformUtils::ConvertUnityToUnreal(const FVector& UnityVector)</p>
<p>2. 静态成员函数:</p>
<p>静态成员函数在类声明中使用 static 关键字,但在定义时不需要再次使用。静态成员函数可以在没有类实例的情况下调用,适用于不依赖于对象状态的工具函数。</p>
<p>3. Unreal Engine C++ 编码规范:</p>
<ul>
<li>
<p>头文件和源文件的分离:头文件中声明函数,源文件中定义函数。</p>
</li>
<li>
<p>使用类作用域:在定义类成员函数时,必须使用类作用域。</p>
</li>
<li>静态成员函数:在类声明中使用 static 关键字,但在定义时不需要再次使用。</li>
</ul>