今回で3Dシューティングゲームの作成完了です。
スコアをつける
Unity: Survival shooter – Scoring points
HUDCanvas → UI → Textを追加してScoreTextという名前にする。
ScoreTextのRect Transformの四角の中に2つの四角が入っているマークをクリックしてcenter topに変更する。Pos Yを-55、Widthを300、Heightを50にする。
Text(Script)のTextをSCORE:0、FontをFuckiestGuy、Font Sizeを50、AlightmentをCenter Middle、Colorを白にする。
Add ComponentからShadowを追加して、X:2、Y:-2に変更する。
Assets → Scripts → Managers → ScoreMangerスクリプトをScoreTextにアタッチする。
ScoreMangerスクリプトのコードは既に書かれてあるので、解説の動画を見ながらふーんという感じで進みます。
using UnityEngine; using UnityEngine.UI; using System.Collections; public class ScoreManager : MonoBehaviour { public static int score; Text text; void Awake () { text = GetComponent <Text> (); score = 0; } void Update () { text.text = "Score: " + score; } }
EnemyHealthスクリプトへ行き、敵が倒れたときスコアを追加するように変更します。
public void StartSinking () { GetComponent <NavMeshAgent> ().enabled = false; GetComponent <Rigidbody> ().isKinematic = true; isSinking = true; ScoreManager.score += scoreValue; Destroy (gameObject, 2f); }
ScoreManagerのscoreはpublic staticなのでこんな感じで簡単にスコアを追加できます。
Playボタンを押して敵を倒すとスコアが10になります。
最後にZombunnyオブジェクトをPrefabsにドロップしてプレハブ化して、Zombunnyオブジェクトを削除します。
たくさん敵を出す
Unity: Survival shooter – Spawning Enemies
ゾンビ熊を作ります。
Assets → Prefabs → Zombearを選択する
Assets → Animation → EnemyACをZombearのAnimator Controllerにアタッチする。
他の2体とは形がだいぶ異なるゾンビ象を作ります。
Assets → Animation
Animator Override Controllerを作成してHellephantAOCという名前に変更する。
HellephantAOCを選択して、EnemyACをHellephantAOCのInspectorのControllerにアタッチする。
Assets → Models → Characters
Hellephantを展開して、その中にあるIdle、Move、DeathをHellephantAOCのInspectorにあるIdle、Move、Deathにそれぞれアタッチする。
Assets → Prefabs
Hellephantを選択して、HellephantAOCをプレハブのHellephantのAnimater Controllerにアタッチする。
ゲームの中で敵を自動的に作り出すためにEnemyManagerを作成します。
空のGameObjectを作成して名前をEnemyManagerに変更して位置をリセットする。
Assets → Scripts → Managers → EnemyMangerスクリプトをEnemyManagerオブジェクトにアタッチする。
解説の動画を見ながらEnemyMangerスクリプトを眺めます。
using UnityEngine; public class EnemyManager : MonoBehaviour { public PlayerHealth playerHealth; public GameObject enemy; public float spawnTime = 3f; public Transform[] spawnPoints; void Start () { InvokeRepeating ("Spawn", spawnTime, spawnTime); } void Spawn () { if(playerHealth.currentHealth <= 0f) { return; } int spawnPointIndex = Random.Range (0, spawnPoints.Length); Instantiate (enemy, spawnPoints[spawnPointIndex].position, spawnPoints[spawnPointIndex].rotation); } }
空のGameObjectを作成してZombunnySpawnPointと言う名前にします。
青緑赤のキューブをクリックして青いボタンを選択します。
ZombunnySpawnPointのPosition X:-20.5 Y:0 Z:12.5、RotationのYを130にします。
空のGameObjectを作成してZombearSpawnPointと言う名前にします。
青緑赤のキューブをクリックして赤紫のボタンを選択します。
ZombearSpawnPointのPosition X:22.5 Y:0 Z:15、RotationのYを240にします。
空のGameObjectを作成してHellephantSpawnPointと言う名前にします。
青緑赤のキューブをクリックして黄色のボタンを選択します。
HellephantSpawnPointのPosition X:0 Y:0 Z:32、RotationのYを230にします。
HierarchyのEnemyManagerを選択します。
PlayerオブジェクトをEnemyManagerのInspectorのPlayer Healthにアタッチします。
PrefabsのZombunnyをEnemyManagerのInspectorのEnemyにアタッチします。
ZombunnySpawnPointをEnemyManagerのInspectorのSpawn Pointsにアタッチします。
HierarchyのEnemyManagerを選択します。
EnemyManagerスクリプトをEnemyManagerにアタッチします。
PlayerオブジェクトをEnemyManagerのInspectorのPlayer Healthにアタッチします。
PrefabsのZombearをEnemyManagerのInspectorのEnemyにアタッチします。
ZombearSpawnPointをEnemyManagerのInspectorのSpawn Pointsにアタッチします。
HierarchyのEnemyManagerを選択します。
EnemyManagerスクリプトをEnemyManagerにアタッチします。
PlayerオブジェクトをEnemyManagerのInspectorのPlayer Healthにアタッチします。
PrefabsのHellephantをEnemyManagerのInspectorのEnemyにアタッチします。
HellephantSpawnPointをEnemyManagerのInspectorのSpawn Pointsにアタッチします。
以上でZombunny、Zombear、Hellephantが各ポイントから湧いてきて襲いかかってくるようになります。
ゲームオーバー画面
Unity: Survival shooter – Game Over
シーンビューを2Dモードにします。
HUDCanvasを右クリックしてUI → Imageを追加します。
作成されたImageをScreenFaderという名前に変更します。
四角の中に2つの四角が入っているボタンをクリックしてstretch stretchに変更します。
Left、Top、Pos Z、Right、Bottomを0にします。
Image(Script)のColorを薄い青にします。
HUDCanvasを右クリックしてUI → Textを追加します。
作成されたTextをGaveOverTextという名前に変更します。
Widht:300 Height:50に変更します。
Text(Script)のTextをGame Over、FontをLuckiestGuy、Font Sizeを50、AlignmentをCenter Middle、Colorを白にします。
Add ComponentでShadowを追加してX:2 Y:-2にします。
HierarchyのHUDCanvasの子要素を下記の順番に変更します。
HealthUI
DamageImage
ScreenFader
GameOverText
ScoreText
下に行くほど前面に出ます。つまりScoreTextが画面の一番上にきて、その下にGameOverText以下が続きます。
ScreenFaderを選択してColorをクリックしてAを0にします。
GameOverTextを選択してColorをクリックしてAを0にします。
HUDCanvasを選択します。
Window → Animationを選択して表示されたWindowをシーンビューのところにドッキングします。
AnimationビューのAdd Curveをクリック。
Assets\AnimationにGameOverClipで保存します。
Add Curveのすぐ横に表示されるGameOverTextを展開してTextを展開してColorを選択(プラスボタンをクリック)します。
同じようにGameOverTextを展開してRect Transformを展開してScaleを選択します。
同じようにScoreTextを展開してRect Transformを展開してScaleを選択します。
同じようにScreenFaderを展開してImageを展開してColorを選択します。
言葉で説明するのは難しいので設定画像を載せておきます。
プレイヤーが倒された1秒後にゲームオーバー画面が表示されます。
最初はGame Overの文字の大きさは0%から始まって0.2秒後に120%、その0.1秒後に100%の大きさになります。
Game Overの表示は最初透明から始まって0.3秒かけて白になります。
ScoreTextは最初100%から始まって0.3秒後に80%の大きさになります。
ScreenFader(青い画面)は最初透明から始まって0.3秒後に青色になります。
こんな感じで文字でもアニメーションにすることができます。
このままではループするので、Assets → Animation → GameOverClipのLoop Timeのチェックを外します。
このままではゲーム開始時にゲームオーバー画面が表示されてしまうので、敵に倒されたときに表示されるように設定します。
Assets → Animation → HUDCanvas
AnimatorビューでCreate State → Empty
作成されたNew Stateの名前をEmptyに変更します。
EmptyをSet As Defaultにします。
EmptyからGameOverClipへTransitionを作成します。
GameOverというTriggerのParameterを作成します。
EmptyからGameOverClipへTransitionを選択して、ConditionsをExit TimeからGameOverへ変更します。
Assets → Scripts → Managers
GameOverManagerスクリプトをHUDCanvasへドロップします。
解説の動画を聞きながらGameOverManagerスクリプトを眺めます。コードが不足していたので解説を見ながら追加します。
using UnityEngine; public class GameOverManager : MonoBehaviour { public PlayerHealth playerHealth; public float restartDelay = 5f; Animator anim; float restartTimer; void Awake() { anim = GetComponent<Animator>(); } void Update() { if (playerHealth.currentHealth <= 0) { anim.SetTrigger("GameOver"); restartTimer += Time.deltaTime; if(restartTimer >= restartDelay) { Application.LoadLevel(Application.loadedLevel); } } } }
HUDCanvasを選択してInspectorのGame Over Manger(Script)のPlayer HealthのところにPlayerオブジェクトをドロップします。
最後のBackgroundMusicを選択してPlay On Awakeをチェックします。
Playボタンを押してゲームをしてみましょう!
Unity3Dの3Dシューティングゲームの完成品!
最後にBuildしてWebに公開です。
サイズが27MBもある・・・。
ゲーム開始するのに少し時間がかかるかも。
あと音が少しうるさいかもしれません。
コメントを残す