前言
在Unity中我们时常会涉及到角度计算,面向对象编程中常用的欧拉角,在DOTS中却没有对应的API调用,这大概是因为DOTS中使用弧度而不是角度,所以我们在传递角度到DOTS中时需要将角度转化成弧度var radian= math.radians(angular)
。然而我们在面向对象中已经知道某种功能对应的欧拉角的算法了,却不知道该功能对应弧度的算法,所以还是需要获得欧拉角,这个功能在Unity中用面向对象的API非常容易实现,但是在DOTS中就不是那么简单了,对比一下代码就知道差距了。
面向对象实现
获取欧拉角这个API相信萌新都知道怎么写,直接上代码:
//面向对象获取欧拉角euler Angles
var eulerAngles=transform.rotation.eulerAngles;
DOTS_11">DOTS实现
在DOTS中我们可以封装一个静态工具类Utilities
来提供功能性的静态函数,方便我们封装一些常用的功能,这个欧拉角的转化就可以放进去,代码如下:
namespace Misc
{
public static class Utilities
{
//将旋转角度quaternion转化成欧拉角Euler Angle
public static float3 ToEulerAngles(quaternion q)
{
float3 angles;
// roll (x-axis rotation)
double sinRotationCosPitch = 2 * (q.value.w * q.value.x + q.value.y * q.value.z);
double cosRotationCosPitch = 1 - 2 * (q.value.x * q.value.x + q.value.y * q.value.y);
angles.x = (float)math.atan2(sinRotationCosPitch, cosRotationCosPitch);
// pitch (y-axis rotation)
double sinPitch = 2 * (q.value.w * q.value.y - q.value.z * q.value.x);
if (math.abs(sinPitch) >= 1)
angles.y = (float)CopySign(math.PI / 2, sinPitch); // use 90 degrees if out of range
else
angles.y = (float)math.asin(sinPitch);
// yaw (z-axis rotation)
double sinYawCosPitch = 2 * (q.value.w * q.value.z + q.value.x * q.value.y);
double cosYawCosPitch = 1 - 2 * (q.value.y * q.value.y + q.value.z * q.value.z);
angles.z = (float)math.atan2(sinYawCosPitch, cosYawCosPitch);
return angles;
}
private static double CopySign(double a, double b)
{
return math.abs(a) * math.sign(b);
}
}
}
后续
其实还有很多非常实用的干货想要分享,因为自己在项目开发中已经打通了DOTS技术的寻路/动画等关键技术栈,所以已经可以利用DOTS技术来做出一个完整的游戏了,最近笔者就打算把游戏案例视频制作出来,让大家看看DOTS制作的游戏是什么样子的。
大家如果想要了解更多Unity的DOTS技术栈相关知识点,可以关注一下博主,博主会根据点赞、收藏、订阅的数据来决定是否抓紧更新专栏,如果关注的人多,自然会爆肝更新,反之,没有人喜欢的话,自然不愿意花时间去分享。
力的作用是相互的,如果觉得博主的分享有用,请分享你的力量,谢谢!