View
47
Download
2
Category
Preview:
Citation preview
徹底比較UnrealEngine4&Unity5スペシャルワークショップセミナー
Unity編
自己紹介
名前:
奥出 成希 (Seiki Okude)
@sokude
職業:
大阪コミュニケーションアート専門学校 講師
立命館大学 映像学部 教授
フリーランスのプログラマー
● Unityを使ってゲームのプロトタイピング● UnrealEngineとの作り比べ● ゲームエンジンを使った制作の取っ掛かりを掴
みましょう
本日の目標
起動します
起動して、3Dプロジェクト設定、AssetPackagesを選択
スタンダードアセットを追加
Cameras、Characters、Effects、ParticleSystems、Prototypingのチェックを入れてDone
CreateProjectでプロジェクトを作成
起動しました
ProjectViewにStandardAssetsがありますか?なければAssetsメニューからでも追加できます。
作成開始
Alwei氏のUnrealEngineでのサードパーソンシューティングとなるべく同じものをUnityで再現してみます。
制作手順も同じようにしてみます。
プレイヤーキャラクターを操作(WASDで移動、スペースでジャンプ)し、マウスでカメラ
を操作、マウス左クリックでショットを撃ちます。
敵はランダムに生成され、それぞれはAIを使ってプレイヤーに近寄ってきます。どん
どん湧き出てくる敵を倒していきます。
ステージの作成:床
ProjectViewのAssets→StandardAssets→Prototyping→Prefabsの中にある[FloorPrototype08x01x08]をSceneに配置
Position(0,0,0)Rotation(0,0,0)Scale(3,1,3)
ステージの作成:壁
ProjectViewのAssets→StandardAssets→Prototyping→Prefabsの中にある[WallPrototype08x08x01]をSceneに配置1つ目:Position(0,0,9)Rotation(0,0,0)Scale(3,1,3)2つ目:Position(0,0,-9) Rotation(0,180,0)Scale(3,1,3)3つ目:Position(-9,0,0)Rotation(0,270,0)Scale(3,1,3)4つ目:Position(9,0,0)Rotation(0,90,0)Scale(3,1,3)
プレイヤーの配置
ProjectViewのAssets→StandardAssets→Characters→ThirdPersonCharacter→Prefabsの中にある[ThirdPersonController]をSceneに配置
Position(0,0,0)
この時点で実行するとカメラは追従しないがWASDでキャラクタが移動する
プレイヤーキャラクタのPrefab化
ProjectViewのトップレベル(Assets)で右クリックPrefabを選択して新規Prefabを作成する名前を[PlayerCharacter]にしておく
プレイヤーキャラクタのPrefab化
Hierarchy上のThirdPersonControllerを今作成したPlayerCharacterプレハブにDrag&Dropする。
Hierarchy上のThirdPersonControllerを一旦削除して、
ProjectView上のPlayerCharacterをHierarchyに
あらためて置き直しておく。
一旦ここで保存
Fileメニュー→SaveScene
シーン名は[scene01]としておく。
追従するカメラの配置
既存のメインカメラは削除する
ProjectViewのAssets→StandardAssets→Cameras→Prefabsの中にある[FreeLookCameraRig]をSceneに配置
Position(0,0,-4)
追従するカメラの配置FreeLookCameraRigを選択状態にしてInspectorで次の設定
● FreeLookCam(Script)のTargetにHierarchyからPlayerCharacterをドロップする
● MoveSpeed:5● TurnSpeed:3● TurnSmoothing:3● LockCursor:ON
○ 実行中はマウスカーソルが消えるので出したい場合はEscキーを押す
追従するカメラの配置
HierarchyでFreeLookCameraRigの子階層にあるPivotをインスペクタで操作
Position(0,2,0)
そのPivotの子階層のMainCameraをインスペクタで操作
Position(0,0,-2)
武器の弾を作成
ProjectView のAssets→StandardAssets→ParticleSystems→Prefabsの中にある[FireComplex]をSceneに配置
武器の弾を作成:前に進ませる
HierarchyでFireComplexを選択状態にしてAddComponent→検索窓に
AutoMoveAndRotateで探して追加
そのコンポーネントのMoveUnitsPerSecondのZに5を設定
武器の弾を作成:自動で消える
同様に検索窓にTimedObjectDestructorで検索して追加
TimeOutに3を設定
実行すると前方へ飛んで行き、3秒でHierarchy上から消える
武器の弾を作成:Prefab化
ProjectViewトップ階層のAssetsの中に
Prefabを新規作成
名前は「PlayerShotWeapon」
HierarchyのFireComplexを新しく作ったPlayerShotWeaponにドロップ
Hierarchy上から削除しておく
プレイヤーから撃てるようにする
Hierarchy上のPlayerCharacterを選択状態にしてInspectorで
AddComponet→NewScriptで新しいスクリプトを追加する
名前は[PlayerAction]、言語はCSharp
PlayerActionをダブルクリックしてMonoDevelopを起動
スクリプトの編集:PlayerAction.cs
using UnityEngine;using System.Collections;
public class PlayerAction : MonoBehaviour {
public Transform PlayerShotWeapon;
// Use this for initializationvoid Start () {
}
// Update is called once per framevoid Update () {
if (Input.GetMouseButtonDown (0)) {Instantiate(PlayerShotWeapon, this.transform.position + new Vector3(0,1,0), this.transform.rotation);
}}
}
スクリプトの解説
if (Input.GetMouseButtonDown (0)) {Instantiate(PlayerShotWeapon,
this.transform.position + new Vector3(0,1,0),this.transform.rotation);
}
Input.GetMouseButtonDown(0)マウスの左ボタン(0番ボタン)の状態を返す
Instantiate関数指定されたオブジェクトをScene上に動的に生成するこの場合はPlayerShotWeapon(弾)をプレイヤーの座標から少し上にずらした位置とプレイヤーの向いている方向に揃えて配置するPlayerShotWeaponは自動で前方向に移動するため、このスクリプトでは動的に生成するところまででOK
スクリプトを作成したらInspectorでPlayerActionのPlayerShotWeapon項目にProjectViewのPlayerShotWeaponプレハブをドロップする
実行すると…
弾が飛びました!
Prefabを更新しておきましょう。
敵の作成
ProjectViewのAssets→StandardAssets→Characters→ThirdPersonCharacters→Prefabsのなかの[AIThirdPersonController]をScene上に配置
Position(0,0,5)
敵の作成
HierarchyのAIThirdPersonControllerの子階層にあるEthanBodyとEthanGlassesのマテリアルをProjectView上のAssets→StandardAssets→Characters→Materialsにある[EthanWhite]に変更する
敵をPrefab化
ProjectViewトップに新しいPrefabを作成名前は[EnemyCharacter]としてHierarchy上のAIThirdPersonControllerをドロップする
Hierarchy上のAIThirdPersonControllerは削除しておく
改めてProjectViewの中にあるEnemyCharacterをSceneに配置
弾の当たり判定を追加
PlayerShotWeaponプレハブをProjectViewからSceneに配置PlayerShotWeaponにSphereColliderを追加
弾の当たり判定を追加
isTriggerにチェックを入れる
LayerをignodeRaycastに設定(ダイアログが出る、Yesを選択)
prefabを更新してHerarchyから削除
弾が当たったあとのリアクション
EnemyCharacterに新しいスクリプトを追加名前は[EnemyAction]
MonoDevelopで編集
スクリプトの編集:EnemyAction.cs
using UnityEngine;using System.Collections;
public class EnemyAction : MonoBehaviour {
public Transform explosion;
// Use this for initializationvoid Start () {}
// Update is called once per framevoid Update () {}
void OnTriggerEnter(Collider _other){Destroy (gameObject);Instantiate (explosion, this.transform.position, Quaternion.identity);
}}
スクリプトの解説
void OnTriggerEnter(Collider _other){Destroy (gameObject);Instantiate (explosion, this.transform.position, Quaternion.identity);
}
OnTriggerEnter(Collider _other)EnemyとisTriggerが設定されているColliderをコンポーネントとして持っているオブジェクトとの接触を検出する。この場合はプレイヤーが発射した弾との当たり判定を検出する
Destroy(gameObject);自分自身をScene上から取り除く
Instantiate自分自身の座標にexplosionオブジェクトを発生させる
Quaternion.identityUnityではオブジェクトの回転情報をQuaternionという形の数であらわす。Quaternion.identityは「回転していない」回転をあらわす。
敵の爆発効果の追加
ProjectViewのAssets→StandardAssets→ParticleSystems→Prefabsのなかにある[Explosion]をSceneに配置
インスペクタでExplosionPhysicsForceのチェックボックスをOFFにする。
敵の爆発効果の追加
AddComponentでTimeObjectDestructorを追加して、TimeOutに3を設定する。これで爆発後3秒で自動消滅する。
敵の爆発効果の追加
ProjectViewのトップで新しいPrefabを作成。名前は[ExplosionNoForce]とするHierarchy上のExplosionを今作ったPrefabにドロップするHierarchy上のExplosionは削除しておく
敵の爆発効果の追加
EnemyCharacterのインスペクタからEnemyActionのexplosionの項目に今作った[ExplosionNoForce]をドロップする
忘れずにPrefabを更新しておく
敵が倒せるようになった
敵のAIを作成
● UnityでもAIを動かすためにはナビゲーションメッシュを使うことができる。
● ビヘイビアツリーは標準では用意されていない● その他、UnrealEngineで使っていた手法と同等のことをしよ
うとすると結構手間がかかる● 簡略版として、それっぽいことを目指す
ナビゲーションメッシュの作成
最初に作った壁と床をすべて選択して、インスペクタで[static]のチェックを入れる。
ナビゲーションメッシュの作成
メニューからWindow→Navigationを開くインスペクタの横にNavigationメニューが現れる右下の[Bake]ボタンでナビゲーションメッシュを作成
ナビゲーションメッシュの作成
結果、左の図のように移動できる範囲は水色に着色される。壁の上にも移動可能領域ができるが、床面から途切れているので問題なし。
敵のスクリプトを変更
void Start () {GetComponent<UnityStandardAssets.Characters.ThirdPerson.AICharacterControl> ().SetTarget (
transform.Find ("/PlayerCharacter"));
}
先ほど作成した敵のスクリプト[EnemyAction]をMonoDevelopで開いて以下の部分を書き足す。
EnemyCharacterにはあらかじめNavMesh機能が組み込まれています。そのNavMesh機能でScene上のどのオブジェクトを追跡するのかを設定することができます。
transform.Find(“/PlayerCharacter”);はScene上のPlayerCharacterを探しています。それをNavMesh機能のSetTargetに渡すことにより追跡対象の設定を行っています。
敵AIの設定
Hierarchy上のEnemyCharacterを選択し、InspectorでNavMeshAgentのSpeedを0.4に設定する。
(Unityではゆっくり追跡するようにアレンジした)
Prefabの更新を忘れないようにしてください
敵をランダムで出現させる
敵をランダムに出現させるスクリプトを作成します。CreateEmptyで空のオブジェクトを作成し[EnemySpawnPoint]に名前を変更します。
敵をランダムで出現させる
EnemySpawnPointを選択状態にてAddComponentでNewScriptで新しいスクリプトを作成します。なまえは[EnemySpawnPoint]にします。
MonoDevelopで開きスクリプトを編集します。
スクリプトの編集:EnemySpawnPoint.cs
using UnityEngine;using System.Collections;
public class EnemySpawnPoint : MonoBehaviour {public Transform enemyCharacter;// Use this for initializationvoid Start () {
StartCoroutine (spawnEnemy ());}// Update is called once per framevoid Update () {}
IEnumerator spawnEnemy(){while (true) {
Instantiate (enemyCharacter,transform.position,Quaternion.identity);yield return new WaitForSeconds (
Random.Range (2, 5));
}}
}
スクリプトの解説
StartCoroutine (spawnEnemy ());
spawnEnemy関数をメインのプログラムの流れとは別に動かす。通常のUpdate()とは関係なく勝手にspawnEnemyが動いていると考えれば良い。
IEnumerator spawnEnemy(){while (true) {
Instantiate (enemyCharacter,transform.position,Quaternion.identity);yield return new WaitForSeconds (
Random.Range (2, 5));
}}
InstantiateでenemyCharacterをこのプログラムがハマっているEnemySpawnPointの位置に発生させる。その後、Random.Rangeで2~5秒の間の乱数を発生させ、WaitForSecondsでその分の時間待ちをする。yield returnは前述の勝手に裏で動いてもらうために一旦メインの流れに返しておいて、然るべき時が来たらもう一度ここから続きを実行する、と考えて良い。以上をwhile(true)で永久ループにして繰り返す。
敵をランダムで出現させる
Hierarchy上のEnemySpawnPointを選択状態にする。
InspectorのEnemySpawnPoint(Script)のEnemyCharacterにProjectView上のEnemyCharacterをドロップする。
Prefab化しておく
例によって、今回もprefab化しておきます。新しいPrefabを作成して、名前を[EnemySpawnPoint]とします。
敵出現ポイントを4箇所設定
ProjectViewからEnemySpawnPointのPrefabをHierarchyにドロップして4箇所の発生ポイントを設定する。
敵出現ポイントを4箇所設定
4つ置いた発生ポイントを図のような場所に座標を変更します。
プレイすると
敵がランダムで襲ってくるようになりました。
まとめ
UnrealEngineとUnityでは少々作り方が違うところがありますが、だいたい似たようなものを作ることが出来ました。
より高度なゲームになってくると、作り方の差は開いていきます。
このセミナーが良い作品を作っていくための足がかりになれば幸いです。
Recommended