53
徹底比較 UnrealEngine4&Unity5 スペシャルワークショップセミナー Unity編

徹底比較Unreal engine4&unity5

Embed Size (px)

Citation preview

Page 1: 徹底比較Unreal engine4&unity5

徹底比較UnrealEngine4&Unity5スペシャルワークショップセミナー

Unity編

Page 2: 徹底比較Unreal engine4&unity5

自己紹介

名前:

奥出 成希 (Seiki Okude)

@sokude

職業:

大阪コミュニケーションアート専門学校 講師

立命館大学 映像学部 教授

フリーランスのプログラマー

Page 3: 徹底比較Unreal engine4&unity5

● Unityを使ってゲームのプロトタイピング● UnrealEngineとの作り比べ● ゲームエンジンを使った制作の取っ掛かりを掴

みましょう

本日の目標

Page 4: 徹底比較Unreal engine4&unity5

起動します

起動して、3Dプロジェクト設定、AssetPackagesを選択

Page 5: 徹底比較Unreal engine4&unity5

スタンダードアセットを追加

Cameras、Characters、Effects、ParticleSystems、Prototypingのチェックを入れてDone

CreateProjectでプロジェクトを作成

Page 6: 徹底比較Unreal engine4&unity5

起動しました

ProjectViewにStandardAssetsがありますか?なければAssetsメニューからでも追加できます。

Page 7: 徹底比較Unreal engine4&unity5

作成開始

Alwei氏のUnrealEngineでのサードパーソンシューティングとなるべく同じものをUnityで再現してみます。

制作手順も同じようにしてみます。

プレイヤーキャラクターを操作(WASDで移動、スペースでジャンプ)し、マウスでカメラ

を操作、マウス左クリックでショットを撃ちます。

敵はランダムに生成され、それぞれはAIを使ってプレイヤーに近寄ってきます。どん

どん湧き出てくる敵を倒していきます。

Page 8: 徹底比較Unreal engine4&unity5

ステージの作成:床

ProjectViewのAssets→StandardAssets→Prototyping→Prefabsの中にある[FloorPrototype08x01x08]をSceneに配置

Position(0,0,0)Rotation(0,0,0)Scale(3,1,3)

Page 9: 徹底比較Unreal engine4&unity5

ステージの作成:壁

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)

Page 10: 徹底比較Unreal engine4&unity5

プレイヤーの配置

ProjectViewのAssets→StandardAssets→Characters→ThirdPersonCharacter→Prefabsの中にある[ThirdPersonController]をSceneに配置

Position(0,0,0)

この時点で実行するとカメラは追従しないがWASDでキャラクタが移動する

Page 11: 徹底比較Unreal engine4&unity5

プレイヤーキャラクタのPrefab化

ProjectViewのトップレベル(Assets)で右クリックPrefabを選択して新規Prefabを作成する名前を[PlayerCharacter]にしておく

Page 12: 徹底比較Unreal engine4&unity5

プレイヤーキャラクタのPrefab化

Hierarchy上のThirdPersonControllerを今作成したPlayerCharacterプレハブにDrag&Dropする。

Hierarchy上のThirdPersonControllerを一旦削除して、

ProjectView上のPlayerCharacterをHierarchyに

あらためて置き直しておく。

一旦ここで保存

Fileメニュー→SaveScene

シーン名は[scene01]としておく。

Page 13: 徹底比較Unreal engine4&unity5

追従するカメラの配置

既存のメインカメラは削除する

ProjectViewのAssets→StandardAssets→Cameras→Prefabsの中にある[FreeLookCameraRig]をSceneに配置

Position(0,0,-4)

Page 14: 徹底比較Unreal engine4&unity5

追従するカメラの配置FreeLookCameraRigを選択状態にしてInspectorで次の設定

● FreeLookCam(Script)のTargetにHierarchyからPlayerCharacterをドロップする

● MoveSpeed:5● TurnSpeed:3● TurnSmoothing:3● LockCursor:ON

○ 実行中はマウスカーソルが消えるので出したい場合はEscキーを押す

Page 15: 徹底比較Unreal engine4&unity5

追従するカメラの配置

HierarchyでFreeLookCameraRigの子階層にあるPivotをインスペクタで操作

Position(0,2,0)

そのPivotの子階層のMainCameraをインスペクタで操作

Position(0,0,-2)

Page 16: 徹底比較Unreal engine4&unity5

武器の弾を作成

ProjectView のAssets→StandardAssets→ParticleSystems→Prefabsの中にある[FireComplex]をSceneに配置

Page 17: 徹底比較Unreal engine4&unity5

武器の弾を作成:前に進ませる

HierarchyでFireComplexを選択状態にしてAddComponent→検索窓に

AutoMoveAndRotateで探して追加

そのコンポーネントのMoveUnitsPerSecondのZに5を設定

Page 18: 徹底比較Unreal engine4&unity5

武器の弾を作成:自動で消える

同様に検索窓にTimedObjectDestructorで検索して追加

TimeOutに3を設定

実行すると前方へ飛んで行き、3秒でHierarchy上から消える

Page 19: 徹底比較Unreal engine4&unity5

武器の弾を作成:Prefab化

ProjectViewトップ階層のAssetsの中に

Prefabを新規作成

名前は「PlayerShotWeapon」

HierarchyのFireComplexを新しく作ったPlayerShotWeaponにドロップ

Hierarchy上から削除しておく

Page 20: 徹底比較Unreal engine4&unity5

プレイヤーから撃てるようにする

Hierarchy上のPlayerCharacterを選択状態にしてInspectorで

AddComponet→NewScriptで新しいスクリプトを追加する

名前は[PlayerAction]、言語はCSharp

PlayerActionをダブルクリックしてMonoDevelopを起動

Page 21: 徹底比較Unreal engine4&unity5

スクリプトの編集: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);

}}

}

Page 22: 徹底比較Unreal engine4&unity5

スクリプトの解説

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

Page 23: 徹底比較Unreal engine4&unity5

スクリプトを作成したらInspectorでPlayerActionのPlayerShotWeapon項目にProjectViewのPlayerShotWeaponプレハブをドロップする

Page 24: 徹底比較Unreal engine4&unity5

実行すると…

弾が飛びました!

Prefabを更新しておきましょう。

Page 25: 徹底比較Unreal engine4&unity5

敵の作成

ProjectViewのAssets→StandardAssets→Characters→ThirdPersonCharacters→Prefabsのなかの[AIThirdPersonController]をScene上に配置

Position(0,0,5)

Page 26: 徹底比較Unreal engine4&unity5

敵の作成

HierarchyのAIThirdPersonControllerの子階層にあるEthanBodyとEthanGlassesのマテリアルをProjectView上のAssets→StandardAssets→Characters→Materialsにある[EthanWhite]に変更する

Page 27: 徹底比較Unreal engine4&unity5

敵をPrefab化

ProjectViewトップに新しいPrefabを作成名前は[EnemyCharacter]としてHierarchy上のAIThirdPersonControllerをドロップする

Hierarchy上のAIThirdPersonControllerは削除しておく

改めてProjectViewの中にあるEnemyCharacterをSceneに配置

Page 28: 徹底比較Unreal engine4&unity5

弾の当たり判定を追加

PlayerShotWeaponプレハブをProjectViewからSceneに配置PlayerShotWeaponにSphereColliderを追加

Page 29: 徹底比較Unreal engine4&unity5

弾の当たり判定を追加

isTriggerにチェックを入れる

LayerをignodeRaycastに設定(ダイアログが出る、Yesを選択)

prefabを更新してHerarchyから削除

Page 30: 徹底比較Unreal engine4&unity5

弾が当たったあとのリアクション

EnemyCharacterに新しいスクリプトを追加名前は[EnemyAction]

MonoDevelopで編集

Page 31: 徹底比較Unreal engine4&unity5

スクリプトの編集: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);

}}

Page 32: 徹底比較Unreal engine4&unity5

スクリプトの解説

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は「回転していない」回転をあらわす。

Page 33: 徹底比較Unreal engine4&unity5

敵の爆発効果の追加

ProjectViewのAssets→StandardAssets→ParticleSystems→Prefabsのなかにある[Explosion]をSceneに配置

インスペクタでExplosionPhysicsForceのチェックボックスをOFFにする。

Page 34: 徹底比較Unreal engine4&unity5

敵の爆発効果の追加

AddComponentでTimeObjectDestructorを追加して、TimeOutに3を設定する。これで爆発後3秒で自動消滅する。

Page 35: 徹底比較Unreal engine4&unity5

敵の爆発効果の追加

ProjectViewのトップで新しいPrefabを作成。名前は[ExplosionNoForce]とするHierarchy上のExplosionを今作ったPrefabにドロップするHierarchy上のExplosionは削除しておく

Page 36: 徹底比較Unreal engine4&unity5

敵の爆発効果の追加

EnemyCharacterのインスペクタからEnemyActionのexplosionの項目に今作った[ExplosionNoForce]をドロップする

忘れずにPrefabを更新しておく

Page 37: 徹底比較Unreal engine4&unity5

敵が倒せるようになった

Page 38: 徹底比較Unreal engine4&unity5

敵のAIを作成

● UnityでもAIを動かすためにはナビゲーションメッシュを使うことができる。

● ビヘイビアツリーは標準では用意されていない● その他、UnrealEngineで使っていた手法と同等のことをしよ

うとすると結構手間がかかる● 簡略版として、それっぽいことを目指す

Page 39: 徹底比較Unreal engine4&unity5

ナビゲーションメッシュの作成

最初に作った壁と床をすべて選択して、インスペクタで[static]のチェックを入れる。

Page 40: 徹底比較Unreal engine4&unity5

ナビゲーションメッシュの作成

メニューからWindow→Navigationを開くインスペクタの横にNavigationメニューが現れる右下の[Bake]ボタンでナビゲーションメッシュを作成

Page 41: 徹底比較Unreal engine4&unity5

ナビゲーションメッシュの作成

結果、左の図のように移動できる範囲は水色に着色される。壁の上にも移動可能領域ができるが、床面から途切れているので問題なし。

Page 42: 徹底比較Unreal engine4&unity5

敵のスクリプトを変更

void Start () {GetComponent<UnityStandardAssets.Characters.ThirdPerson.AICharacterControl> ().SetTarget (

transform.Find ("/PlayerCharacter"));

}

先ほど作成した敵のスクリプト[EnemyAction]をMonoDevelopで開いて以下の部分を書き足す。

EnemyCharacterにはあらかじめNavMesh機能が組み込まれています。そのNavMesh機能でScene上のどのオブジェクトを追跡するのかを設定することができます。

transform.Find(“/PlayerCharacter”);はScene上のPlayerCharacterを探しています。それをNavMesh機能のSetTargetに渡すことにより追跡対象の設定を行っています。

Page 43: 徹底比較Unreal engine4&unity5

敵AIの設定

Hierarchy上のEnemyCharacterを選択し、InspectorでNavMeshAgentのSpeedを0.4に設定する。

(Unityではゆっくり追跡するようにアレンジした)

Prefabの更新を忘れないようにしてください

Page 44: 徹底比較Unreal engine4&unity5

敵をランダムで出現させる

敵をランダムに出現させるスクリプトを作成します。CreateEmptyで空のオブジェクトを作成し[EnemySpawnPoint]に名前を変更します。

Page 45: 徹底比較Unreal engine4&unity5

敵をランダムで出現させる

EnemySpawnPointを選択状態にてAddComponentでNewScriptで新しいスクリプトを作成します。なまえは[EnemySpawnPoint]にします。

MonoDevelopで開きスクリプトを編集します。

Page 46: 徹底比較Unreal engine4&unity5

スクリプトの編集: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));

}}

}

Page 47: 徹底比較Unreal engine4&unity5

スクリプトの解説

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)で永久ループにして繰り返す。

Page 48: 徹底比較Unreal engine4&unity5

敵をランダムで出現させる

Hierarchy上のEnemySpawnPointを選択状態にする。

InspectorのEnemySpawnPoint(Script)のEnemyCharacterにProjectView上のEnemyCharacterをドロップする。

Page 49: 徹底比較Unreal engine4&unity5

Prefab化しておく

例によって、今回もprefab化しておきます。新しいPrefabを作成して、名前を[EnemySpawnPoint]とします。

Page 50: 徹底比較Unreal engine4&unity5

敵出現ポイントを4箇所設定

ProjectViewからEnemySpawnPointのPrefabをHierarchyにドロップして4箇所の発生ポイントを設定する。

Page 51: 徹底比較Unreal engine4&unity5

敵出現ポイントを4箇所設定

4つ置いた発生ポイントを図のような場所に座標を変更します。

Page 52: 徹底比較Unreal engine4&unity5

プレイすると

敵がランダムで襲ってくるようになりました。

Page 53: 徹底比較Unreal engine4&unity5

まとめ

UnrealEngineとUnityでは少々作り方が違うところがありますが、だいたい似たようなものを作ることが出来ました。

より高度なゲームになってくると、作り方の差は開いていきます。

このセミナーが良い作品を作っていくための足がかりになれば幸いです。