以下のプログラムは3D空間内を飛行するNavyからのShellの連射処理を実装したものである。 使用するキー操作は以下のとおり。 A : (押し続けることで)Shellを連射する。 S : 飛行開始あるいは停止のスイッチ。 H, L : Navyに対して水平方向の回転を実行する。 J, K : Navyに対して垂直方向の回転を実行する。
[Code1] (実行結果 図)
if (!i_INITIALIZED)
{
Navy.lastShootFrame = 0;
Navy.shootInterval = 8;
Navy.shellSpeed = 1.0f;
Navy.initShootDirection = Vector3.forward;
Navy.initShootPositions = new Vector4[]
{
new Vector4( 0.358f, -0.13965f ,0.2371f, 1.0f),
new Vector4(-0.358f, -0.13965f ,0.2371f, 1.0f)
};
i_INITIALIZED = true;
}
NavyMotion();
i_frameCount++;
Matrix4x4 M = Matrix4x4.identity;
Matrix4x4 R = Matrix4x4.identity;
int numShooter = 0;
if (Input.GetKey(KeyCode.A))
{
if (i_frameCount >= Navy.lastShootFrame + Navy.shootInterval)
{
Navy.lastShootFrame = i_frameCount;
numShooter = 2;
M = Navy.GetMatrix();
R = M;
R.SetColumn(3, new Vector4(0, 0, 0, 1));
}
}
Vector3 posNavy = Navy.GetWorldPosition();
foreach (var shell in Shell)
{
if (shell.active)
{
Vector3 newShellPos = shell.position + shell.speed * shell.direction;
if ((posNavy - newShellPos).magnitude > 80.0f)
{
shell.active = false;
shell.position = new Vector3(-1000, 0, 0);
}
else
{
Matrix4x4 mtx = TH3DMath.GetTranslation4x4(newShellPos) * shell.rotMatrix;
shell.SetMatrix(mtx);
}
}
else
{
if (numShooter > 0)
{
Vector3 startPos = M * Navy.initShootPositions[2 - numShooter];
Vector3 shootDir = M * Navy.initShootDirection;
shell.active = true;
shell.direction = shootDir;
shell.speed = Navy.shellSpeed;
shell.rotMatrix = R;
Matrix4x4 mtx = TH3DMath.GetTranslation4x4(startPos) * shell.rotMatrix;
shell.SetMatrix(mtx);
numShooter--;
}
}
}