290 Views
October 09, 20
スライド概要
Unity認定アソシエイトの試験範囲を念頭にUnityでのゲーム制作を行う上で、プログラマーやデザイナー、プランナーなどポジションに関係なく知っておきたいUnityの基本的な知識(Unity認定アソシエイト試験レベル)を横断的に身に付けることを目指します。
■こんな人におすすめ
・Unityの基本的な使い方、入門書レベルの理解はできている
・これからUnityの授業を学校で取り入れてみたいが、あまりUnityに詳しくない先生
■トレーニング環境と準備について
・使用するUnityのバージョン: Unity2019.4.8f1
・ AssociateTraning.unitypackageを追加する。
以下のURLからダウンロード可能です。
https://drive.google.com/file/d/1V3PzmZE7POf0_QEIIQIIPqVZV6rYmPDk/view?usp=sharing
※このトレーニングはすでにUnity入門書レベルの内容は理解されていることを前提に資料や内容をまとめています。そのため、基本的なUnityの情報は別途Unityの入門書などを読んでください。
リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。
Generative Art — Made with Unity ティーチャートレーニングデイ 「認定アソシエイト編」 ユニティ・テクノロジーズ・ジャパン株式会社 荒川 巧也 1
Unity認定アソシエイト試験 Unityに関する基本的な知識を幅広く持っている ことを示すことができる資格です。 * Unity2017.3で作問されています。 今回のトレーニングメニューは、試験合格レベ ルに達していただくことが目標ですが、今回のト レーニングメニューは学校の授業で取り上げて いただきたい内容をベースにまとめました。 2
Unityはゲーム以外の分野での利用が増えている Unity Japan Office Project BMWでの採用事例 *Unityができることで学生の就職チャンスが広がるようになってきています。 3
より詳しく知りたい場合はおすすめビデオ 様々に広がるUnityの世界 https://www.youtube.com/watch?v=6Dqm2qrU0Dk&t=614s 4
実際にトレーニングを始める前に・・ Unityプロジェクトについて振り返ってみましょう。 5
Unityプロジェクトとは? Unityプロジェクトは ”シーン”から成り立っています。 6
Scene(シーン)とは? シーンは” GameObject (ゲームオブジェクト )”で成り立っています。 岩 木 草 ひよこ 床 7
Scene(シーン)とは? Sceneに配置されている GameObjectはHierarchy Windowで確認することができる。 ←この場合だと ”main”シーンに配置されている GameObjectが表示されている。 ライトやカメラなど”目には見えないもの”もGameObjectになります。 8
GameObject (ゲームオブジェクト) とは? GameObjectはComponent(コンポーネント )によって特徴付けされます。 コンポーネント 9
ひよこを配置してシーンのセットアップする 10
今回のトレーニング環境と準備について 使用するUnityのバージョン: Unity2019.4.8f1 ・ AssociateTraning.unitypackageを追加する。 以下のURLからダウンロード可能です。 https://drive.google.com/file/d/1V3PzmZE7POf0_QEIIQIIPqVZV6rYmPDk/view?us p=sharing このトレーニングはすでにUnity入門書レベルの内容は理解されていることを前提に資 料や内容をまとめています。 そのため、基本的なUnityの情報は別途Unityの入門書などを読んでください。 11
パッケージを取り込んで始めましょう! 12
Stageを追加します Assets -> Training -> Models 名前を”Stage”にする。 13
FloorにMeshColliderを追加する 14
FloorにFloorMaterialを追加する 15
Floor(Stage)にマテリアルが追加された 16
Hiyokoを追加する Assets -> Traning -> Models 17
Hiyokoが追加された 18
追加したHiyokoのコンポーネントを見てみる 19
マテリアル・シェーダー・テクスチャ Unity のレンダリングは マテリアル と シェーダー と テクスチャ によって行われます。 Unity のマテリアルとシェーダーとテクスチャは密接に関係しています。 ・マテリアル (最終的な描画設定を行うもの: 使用するシェーダーと使用するテクスチャもここで設定する。 ) マテリアル は、使用するテクスチャ、そのタイリング設定や色調などへの参照を含んで、どのようにモデル表面を描画するかを定義します。 マテリアルに用意されたオプションで、どのシェーダーをそのマテリアルに使用するかを決めます。 ・シェーダー(描画アルゴリズムのプログラム) シェーダー は、光源入力とマテリアル設定をベースにして、ピクセル毎の描画色を計算するための数学的な計算とアルゴリズムを内包した、小さなスクリプトです。 ・テクスチャ(画像データ) テクスチャ はビットマップ画像です。マテリアルにはテクスチャへの参照が含まれ、それによりマテリアルのシェーダーは、オブジェクト表面の色を計算するのに、テクスチャを使えるようになりま す。加えて、オブジェクト表面の基本色 (アルベド )では、反射率や粗さなどのマテリアル表面のさまざまな要素をテクスチャで置き換える事ができます。 https://docs.unity3d.com/ja/2017.4/Manual/Shaders.html 20
Hiyokoに“Rigidbody”と”CapsuleCollider”を追加する 21
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
Hiyokoに追加する
PlayerController.cs
public class PlayerController : MonoBehaviour {
public float speed = 8f; //移動スピード
Rigidbody rigid; //Rigidbody型の変数
Vector3 moveDirection; //移動方向
// Use this for initialization
void Start () {
rigid = GetComponent<Rigidbody>(); //Rigidbodyを参照
}
private void FixedUpdate()
{
float v = Input.GetAxis("Vertical"); //上下のインプットを取る
float h = Input.GetAxis("Horizontal"); //左右のインプットを取る
moveDirection.Set(h, 0, v); //インプットを移動方向に変える
moveDirection = moveDirection.normalized * speed * Time.deltaTime; //移動スピードをかける
rigid.MovePosition(transform.position + moveDirection); //実際に移動させる
transform.LookAt(transform.position + moveDirection); //移動方向にひよこの顔を向ける
}
}
22
転がりを防止する 23
ひよこが動くようになった 24
カメラの設定を行う 25
Cinemachine追加しカメラの位置を調整する 26
Cinemachineを追加する 27
Cinemachineを使用する ← “Create Virtual Camera”をクリックする。 28
VirtualCameraが追加された 29
Cinemachineのパラメータを設定する カメラが斜め上からになるように offsetを調整する。 30
カメラが追従するようになった 31
PlayerControllerにAttributeを追加する public class PlayerController : MonoBehaviour { [Range(1,10)] // speedの範囲を指定 public float speed = 8f; Rigidbody rigid; Vector3 moveDirection; Animator animator; 32
Unityのアニメーション機能について学ぶ 33
AnimatorControllerを追加する Project Windowで右 クリックしてAnimator Controllerを追加す る。 34
HiyokoControllerをControllerに追加する 2019.4 Animatorのアイコン 35
Hiyokoを選択してAnimator Windowを開く 36
Animator Windowが開く 37
Bool型のパラメータを作成する 38
AnimationClipを追加する 39
Animation Clip どのように動かキーフレームが時間軸で打たれており、これはボーン構造がどのように 動 くべきなのかが定義されている。この情報によってアニメーションが再生される。 40
状態遷移をつなぐ ステートを選択して右クリックする。 Idle←→Runでステートをつなぎます。 41
Idle → Run のConditionsの設定について クリックする 42
Run → Idle のConditionsの設定について 43
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
[Range(1,10)]
public float speed = 8f;
Rigidbody rigid;
Vector3 moveDirection;
Animator animator;
Hiyokoのアニメーションを制御
// Use this for initialization
void Start () {
rigid = GetComponent<Rigidbody>();
animator = GetComponent<Animator>();
}
void FixedUpdate()
{
float v = Input.GetAxis("Vertical");
float h = Input.GetAxis("Horizontal");
moveDirection.Set(h, 0, v);
moveDirection = moveDirection.normalized * speed * Time.deltaTime;
rigid.MovePosition(transform.position + moveDirection);
transform.LookAt(transform.position + moveDirection);
bool running = h != 0f || v != 0f; //矢印キーのインプットがあればTrueになる。
animator.SetBool("IsRunning", running); // IsRunningにrunningを代入
}
}
44
ひよこがアニメーションするようになった 45
オーディオを追加する 46
HiyokoにAudioSourceを追加する 47
アセットストアからFootstep(SE)を追加 48
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[Range(1,10)]
public float speed = 8f;
public AudioClip clip; //オーディオクリップの変数
PlayerControllerに追記
足音を鳴らす
Rigidbody rigid;
Vector3 moveDirection;
Animator animator;
AudioSource audio; //オーディオソースの変数
// Use this for initialization
void Start()
{
rigid = GetComponent<Rigidbody>();
animator = GetComponent<Animator>();
audio = GetComponent<AudioSource>(); //オーディオソースを参照
}
void FixedUpdate()
{
float v = Input.GetAxis("Vertical");
float h = Input.GetAxis("Horizontal");
moveDirection.Set(h, 0, v);
moveDirection = moveDirection.normalized * speed * Time.deltaTime;
rigid.MovePosition(transform.position + moveDirection);
transform.LookAt(transform.position + moveDirection);
bool running = h != 0f || v != 0f;
animator.SetBool("IsRunning", running);
}
public void PlayRunningSe(){
audio.PlayOneShot(clip); //オーディオクリップを再生する
}
}
49
オーディオクリップを追加する FootStep(grass and snow)のオーディオクリップを追加する。 50
アニメーションのイベント機能を使います ↑クリックする。 51
RunアニメーションのEventsに関数を設定 ←Runをクリックする クリック 先ほどPlayerControllerに追加した ”PlayRunningSe”関数 52
Hiyokoの足音が鳴るようになりました 53
Particleを使ってみよう 54
火の玉を作ろう! 55
Particle Systemを追加する 56
パーティクルを作成する 57
Color over Lifetimeを設定する 58
Size Over Lifetimeを設定する クリックする。 59
このような形になればOK!! 60
FireにSphere Colliderを追加する 61
FireにRigidbodyを追加する ←チェックをはずす。 62
Fireの位置を調整する Z軸を前に配置する。 63
Bulletタグを作成して設定する 64
FireにBulletスクリプトを追加する 65
Bulletスクリプトを追加する using System.Collections; using System.Collections.Generic; using UnityEngine; public class Bullet : MonoBehaviour { // Use this for initialization void Start () { Destroy(gameObject, 3.0f); //3秒後に削除 } } 66
FireをPrefab化する 67
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerShoot : MonoBehaviour {
public GameObject bullet; //PrefabのFireを追加
public Transform muzzle; //空のオブジェクトの muzzleを設定
HiyokoにPlayerShootを追加
*NewScriptを追加してください。
public float bulletSpeed = 1000f;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
// 左クリックが押された時に
if (Input.GetMouseButtonDown(0))
{
// Fireを生成する
GameObject bullets = Instantiate(bullet) as GameObject;
// Fireの位置を調整する
bullets.transform.position = muzzle.position;
Vector3 bulletDirection;
bulletDirection = gameObject.transform.forward * bulletSpeed;
// Fireに力を加えて発射
bullets.GetComponent<Rigidbody>().AddForce(bulletDirection);
}
}
}
68
HiyokoのTagを”Player”にする 69
空のゲームオブジェクト”Muzzle”を追加する 70
PlayerShootにFireとMuzzleを追加する 71
PlayerShootにFireとMuzzleが追加された 72
Fireが発射されるようになった 73
Attackアニメーションを追加する 74
“Attack”アニメーションクリップを追加する 75
Attackパラメータを追加 76
Attackステートに関する状態遷移をつなぐ 状態遷移をつなぐ 状態遷移をつなぐ 77
“AnyState → Attack”と”Attack → Idle”のConditions設定 78
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerShoot : MonoBehaviour {
public GameObject bullet;
public Transform muzzle;
public float bulletSpeed = 1000f;
Animator animator;
PlayerShoot
赤字部分を追記する
// Use this for initialization
void Start () {
animator = GetComponent<Animator>();
}
// Update is called once per frame
void Update () {
// z キーが押された時
if (Input.GetMouseButtonDown(0))
{
animator.SetTrigger("Attack");
// 弾丸の複製
GameObject bullets = Instantiate(bullet) as GameObject;
// 弾丸の位置を調整
bullets.transform.position = muzzle.position;
Vector3 bulletDirection;
bulletDirection = gameObject.transform.forward * bulletSpeed;
// Rigidbodyに力を加えて発射
bullets.GetComponent<Rigidbody>().AddForce(bulletDirection);
}
}
}
79
Attackアニメーションが再生されるようになった 80
ModelsフォルダのKarasuを追加する 81
KarasuにCapsuleColliderを追加する 82
KarasuにAnimation Controllerを追加する 83
KarasuControllerをKarasuに追加する 84
(カラスの)Animatorを開く 85
Runアニメーション追加 86
Runアニメーションが再生されるようになる 87
ワークショップ アニメーション編 Ringoを配置してRingoを取ったらジャンプアニメーションをするようにアニメーション遷移を作ってみよう 88
必要な素材はこちらにあります! ←Ringoのモデルはこちらです。 Jumpアニメーションはこちらです。 89
ワークショップ ヒント 1 リンゴにColliderを追加する 90
Animator ヒント2 91
スクリプト (PlayerController)ヒント3 void OnTriggerEnter(Collider other) { if (other.CompareTag ("Item")) //Itemタグを付ける { Debug.Log("当たった!"); } } 92
スクリプト (PlayerController)ヒント3 ログが出ることがわかります。 93
このような形でアニメーション再生されればOK 94
ナビゲーションシステムについて 95
KarasuにNavimeshAgentを追加する 96
StageをHierarchy Windowで選択する Navigation Staticにチェックを入れる 97
Navigation Bakeを行う 98
NavMeshが貼られました 99
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI; //名前空間追加
カラスにEnemyControllerを追加
public class EnemyController : MonoBehaviour
{
NavMeshAgent nav; //NavimeshAgent型の変数
GameObject target; //ターゲット追加
// Use this for initialization
void Start()
{
nav = GetComponent<NavMeshAgent>(); //自分自身のNavMeshAgentを参照
target = GameObject.FindGameObjectWithTag("Player"); //targetにPlayerを参照
}
void Update()
{
nav.SetDestination(target.transform.position);
}
}
100
追いかけてくるようになった 101
Navimeshのコストについて 102
エリアの設定をする エリア名とコストを設 定する エリアを設定する。 103
再度Bakeする 104
コストの高いところは避けて動くようになる Hard Zone 105
NavimeshAgentで動いた際にオブジェクトを無視して貫通する 106
NavMesh Obstacleを追加する 107
障害物を避けるようになる 108
ここまでできたらKarasuをPrefab化する ここでHierarchy windowのKarasu削除する 109
空のオブジェクトを追加して”GameManager”にする 110
GameManagerにEnemyManagerを追加する
using UnityEngine;
using System.Collections;
public class EnemyManager : MonoBehaviour
{
public GameObject enemyPrefab; //Karasuのプレハブを追加する
public Transform[] spawnPoints; //Karasuの生成ポイントを追加する
public float interval = 3.0f; //Karasuの生成インターバル
float time = 0.0f;
void Update()
{
time += Time.deltaTime; //時間をはかる
if(time > interval) //インターバルの時間以上に過ぎれば
{
int spawnPointIndex = Random.Range(0, spawnPoints.Length); //生成ポイントをランダムで選ぶ
GameObject enemy = Instantiate(enemyPrefab,spawnPoints[spawnPointIndex].position,spawnPoints[spawnPointIndex].rotation); //Enemyを生成する
time = 0f; //時間を0秒に戻す
}
}
}
111
GameManagerにEnemyManagerを追加する 112
空のオブジェクトを配置する (カラスの生成ポイント) 113
EnemyManagerに設定する 114
カラスが生成されるようになった 115
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI; //名前空間追加
public class EnemyController : MonoBehaviour
{
public int enemyHealth = 10;
public int damageAmount = 5;
EnemyControllerにライフを実装する
赤字を追記する
NavMeshAgent nav; //NavimeshAgent型の変数
GameObject target; //ターゲット追加
// Use this for initialization
void Start()
{
nav = GetComponent<NavMeshAgent>(); //自分自身のNavMeshAgentを参照
target = GameObject.FindGameObjectWithTag("Player"); //targetにPlayerを参照
}
void Update()
{
nav.SetDestination(target.transform.position);
}
void OnCollisionEnter(Collision col)
{
if (col.gameObject.CompareTag ("Bullet"))
{
Destroy(col.gameObject);
TakeDamage(damageAmount);
}
}
void TakeDamage(int damage)
{
enemyHealth -= damage;
if (enemyHealth <= 0)
{
Destroy(gameObject);
}
}
}
116
uGUIの特徴 ① ↓ UIオブジェクト ↓ UIオブジェクト ↓ UIオブジェクト ↓Canvas uGUIはHierarchy view上では、必ずCanvasの子供オブジェクト上としてUIパーツを配置 されます(Canvasの子供オブジェクトにしなければUIオブジェクトは描画されません)。 Scene view上でもCanvasの上にUIパーツが配置されます。 117
uGUIの特徴 ② 様々な描画モードを搭載。 Canvas Render Mode Screen Space - OverLay ほかのGameObjectの中でUIが1番前に描画されるモード。 Screen Space - Camera カメラを指定してUIを描画するモード。複数のCanvasを準備した際にCanvasの描画する順番をSorting Layerで指定すること ができます。 World Space ほかの3Dオブジェクトと同じように描画されるモード。ほかモードだとGameObjectと同じようにTransform情報が適応されます。 118
Karasuに頭の上にHPのUIを配置する 119
Karasuの子供オブジェクトにCanvasとSliderを追加 120
Render Modeを”WorldSpace”にする 121
CanvasとSliderの位置を調整する 122
このようにSliderが配置される 123
HandSlideAreaを削除する HandSlideArea 124
BackgroundとFillの色を設定する 125
SliderのValueを1にする 126
Fillのサイズを調整する 127
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI; //名前空間追加
using UnityEngine.UI;
public class EnemyController : MonoBehaviour
{
public int enemyHealth = 10;
public int damageAmount = 5;
public Slider HpSlider;
EnemyControllerに赤字部分を追記
HP情報をSliderを連携する
NavMeshAgent nav; //NavimeshAgent型の変数
GameObject target; //ターゲット追加
// Use this for initialization
void Start()
{
nav = GetComponent<NavMeshAgent>(); //自分自身のNavMeshAgentを参照
target = GameObject.FindGameObjectWithTag("Player"); //targetにPlayerを参照
HpSlider.value = enemyHealth / 10;
}
void Update()
{
nav.SetDestination(target.transform.position);
}
void OnCollisionEnter(Collision col)
{
if (col.gameObject.tag == "Bullet")
{
Destroy(col.gameObject);
TakeDamage(damageAmount);
}
}
void TakeDamage(int damage)
{
enemyHealth -= damage;
HpSlider.value = (float)enemyHealth / 10;
if (enemyHealth <= 0)
{
Destroy(gameObject);
}
}
}
128
Enemy ControllerのHpSliderにSliderを追加する 129
HPのUIが機能するようになった HPのUIが機能するようになった。 130
SetUIPositionForCameraをCanvasに追加 using System.Collections; using System.Collections.Generic; using UnityEngine; public class SetUIPositionForCamera : MonoBehaviour { // Update is called once per frame void Update() { transform.LookAt(Camera.main.transform); //ライフゲージが相手のカメラを向く } } 131
KarasuのApplyをクリックする Applyをクリックする *ここまでできたら HierarchyのKarasu削除 132
HPのUIがカメラの方向を向くようになった 133
スコアテキストを追加する 134
テキストを設定する 135
Anchorの設定を行う 136
GameManagerにScoreManagerを追加する 137
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; ScoreManagerスクリプト public class ScoreManager : MonoBehaviour { public static int score = 0; public Text scoreText; // Update is called once per frame void Update () { scoreText.text = "Score: " + score.ToString(); } } 138
ScoreManagerにTextを追加する 139
EnemyController Scoreが入るようにする void TakeDamage(int damage) { enemyHealth -= damage; HpSlider.value = (float)enemyHealth /10 ; if (enemyHealth <= 0) { ScoreManager.score += 10; Destroy(gameObject); } } 140
スコアが入るようになった 141
TimeLineについて 142
TimeLineについて プログラミング無しで、時系列にアニメーション、オーディオ、カメラワーク、パーティクル の発生などを視覚的に再生設定を行う機能。 ゲーム内ムービーや映像作品を作ることが簡単に行える。 143
Timeline Windowを表示する 144
空のオブジェクトを追加する TimelineWindowの”Create”する 145
Timeline Windowが有効化されます 146
Trackを追加する 147
Activation Trackを使ってみる アクティブと非アクティブを時間軸で設定する。 ↑アクティブ化・非アクティブ化したいオブジェクトを Hierarchy Windowから追加する。 148
Animation Trackを追加する アニメーションを追加する。 149
Animation Trackにアニメーションクリップを追加 150
アニメーションのブレンド アニメーションのブレンドも行えます。 151
アニメーションが追加されます 152
Default Playables Timelineのトラックの種類を追加できる 153
追加されたトラック 154
Transform Tween Track パスを設定してオブジェクトを動かすことができる。 155
空のオブジェクトを追加してパスを設定する Z軸方向を前にする 156
Transform Tween Trackを追加する パスで動かしたいオブジェクトを追加する。 157
Waypointを使ってPathを設定する 158
Path通りに動くようになる 159
Text Switcher Track Text SwitcherはTextのテキスト内容とテキストの大きさを変えることができるようになる。 ↑テキストを追加する 160
Text Switcher Track 161
Text Switcher Track 162
Time Dilation Trackを追加する 時間の流れをコントロールできる 163
Cinemachine Trackを追加してCinemachineを制御 164
VirtualCameraを複数台設置する 165
VirtualCameraを複数台追加 166
Cinemachine Shot Clipを追加する 167
Main Cameraを追加する ↑ここにはMainCamera(CinemachineBrain)が 追加されたオブジェクトを追加する。 168
Cinemachine Shotを追加する Shotを追加する。 169
ワークショップ TimeLineを利用して映像を作成しよう 170
知っておきたいUnityのサービス Unity Collaborate Unity Teams Basic 無料 少人数のチームのスタートアップに。1GB のクラウドストレージが付属し、最大で 3 人 のチームメンバーを追加できます。 171
Unity Studentプランのご紹介 https://store.unity.com/ja/academic/unity-student Unity Student には、5 シートの Unity Teams Advanced が付属します。 172
知っておきたいUnityのサービス Cloud Build 173
知っておきたいUnityのサービス Unity Analytics 174
【Unite Tokyo 2019】開発から運用まで、デベロッパーをサポートするUnity Services https://www.slideshare.net/UnityTechnologiesJapan002/unite-tokyo-2019unity-services 175
もっとUnityを学びたい方へ https://unity.com/ja/products/learn-premium 176