Turret Prefab的整体架构
文章目录
一.前言
本文在1.2.1和1.2.1.1.1部分简述该Prefab的巧妙之处,其他部分均为实体,无需分析。
二.Turret(炮台)
1.Base(底座)
1.2.Cube(立方体)
Global坐标
Local坐标
1.2.1.Barrel Pivot(炮管枢轴)
Global坐标
Local坐标(继承于Cube)
我们可以看到1.2.1名为Parrel Pivot(炮管枢轴),它本质是一个空物件,即除了Transform没有其他组件,选中后只能看到一个坐标系,而这里他作为cube的子物件,自然就代表了Cube的中心坐标,其position值为(0,0,0),但细心观察可以发现,选中Barrel Pivot后,坐标系并没有在Cube中心显示,而是显示在其子物体Barrel的中心位置,这是因为创建了空对象之后,其下的子物件Barrel自动粘附在这个坐标系上,对Barrel Pivot操作时子物体Barrel也会随之变动,操作子物件Barrel时Barrel Pivot不会变动,但一般Barrel Pivot是作为参照使用,不会轻易直接对其操作。因此子物件Barrel的坐标为相对于Cube(即此处的Barrel Pivot)坐标系下的相对位置坐标,Launcher的坐标为相对于Barrel坐标系下的相对位置坐标。
1.2.1.1.Barrel(炮管)
Global坐标
Local坐标(继承于Barrel Pivot)
1.2.1.1.1.Launcher(发射器)
Global坐标
Local坐标(继承于Barrel)
Launcher同Barrel Pivot类似,本质是一个空物件,在此处有它的巧妙之处,我们可以看到右侧有一个脚本组件,这个脚本是用来发射炮弹(刚体Rigidbody)的,因为炮台是由三个实体组成的,无论挂在哪个实体上都会有碰撞发生(除非把所有Collider关掉),炮弹会在里面直接爆炸,而这个空物件放在炮口附近就会避免这个问题的发生,而且看起来也很像从里面发射出来的效果。
脚本代码如下:
public Rigidbody projectile;
public float speed = 4;
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
Rigidbody p = Instantiate(projectile, new Vector3(transform.position.x,transform.position.y,transform.position.z), transform.rotation);
p.velocity = transform.forward * speed;
}
}
这里的forward指的是z方向,后面几组图的物体都有旋转量,Cube旋转是朝向调整;Barrel旋转是形状需要,将圆柱体放平;而Launcher是为了炮弹的发射方向正确,这才是最终目的。