UnityでHelloWorldしてみよう
Unityで簡単なゲームを作ってみる(Roll-a-Ball) by shinyaoguri.icon https://gyazo.com/cb5e261a42996dd549f093a33662f845
内容
準備
ユニティちゃん.iconマウスが絶対欲しい(ホイールがあるやつ)
事前の環境構築
2. Unityの最新のLTS版をインストールする 環境設定の変更
ゲームのプレイモードを明確にするために背景色を変更する
プレイ中に変更しても変更箇所は保存できないので,ミスが多発する
https://gyazo.com/6871b9a31395466410e672160c7df651
3D(URP)Coreで新規プロジェクトの作成
https://gyazo.com/b6bc69f5877ab335a007f2b6f8d16f7b
出来上がった空のプロジェクトはこんな感じ
https://gyazo.com/d8105d5fb24fc9bad9dca72131ebbbb4
ここで生成されたファイル構成を一通り眺めると良いと思う
基本的に最初はAssetsの中身をいじっていく
code:tree
.
├── Assets
│ ├── Readme.asset
│ ├── Readme.asset.meta
│ ├── Scenes
│ │ ├── SampleScene.unity
│ │ └── SampleScene.unity.meta
│ ├── Scenes.meta
│ ├── Settings
│ │ ├── ...
│ │ └── ...
│ ├── Settings.meta
│ ├── TutorialInfo
│ ├── TutorialInfo.meta
│ ├── UniversalRenderPipelineGlobalSettings.asset
│ └── UniversalRenderPipelineGlobalSettings.asset.meta
├── Library
│ ├── ...
│ └── ...
├── Logs
│ ├── ...
│ └── ...
├── Packages
│ ├── manifest.json
│ └── packages-lock.json
├── ProjectSettings
│ ├── ...
│ └── ...
├── README
├── Temp
│ ├── ...
│ └── ...
└── UserSettings
├── EditorUserSettings.asset
├── Layouts
└── Search.settings
不要なファイルを消す
Assets>Readme.assetsは単なる説明なので不要.消しても問題ない.
「Remove Readme Assets」のボタンを押してしまう
するとファイルが少し減る
https://gyazo.com/23e789348591e77ffdd74076f86cb846
シーンの名前を適当に変える
デフォルト状態だとシーンの名前が「SampleScene」だったので適当な名前に変更しておこう
ここでは「MiniGame」に変更した
https://gyazo.com/b6ce9b1911535a85b06cf6e0d0b958b7
ゲームのフィールドとなるゲームオブジェクトを生成する
Hierarchieビューで右クリック>3D Object>Plane
名前は適当にGroundに変更した
厚みのない薄い板みたいなので出現する
https://gyazo.com/9153da190a81478aaad6c2a53e3d0f82
ゲームビュー空の見た目がわかりにくいので,エディタレイアウトをDefault→ 2 by 3に変更した
この辺りはお好みで良い.単に見た目の問題なので,いつでも変更できる.
2 by 3だとSceneとGameビューが同時にみれるのが良いらしい(本当に好みの問題)
https://gyazo.com/c7ce311d96275598bf424a293ab3aca6
次にプレイヤーが操作する球を生成する
Hierarchieビューで右クリック>3D Object>Sphere
名前は適当にPlayerに変更した
真ん中に球体が出現する
https://gyazo.com/e3f3b0ecd3c578a4d1dee25c09e4eb7a
プレイヤーの球がちょうどフィールドに乗ってる状態にしたい
今のままだと地面にめり込んでるので,Y軸方向に移動させる.
矢印で移動させることもできるし,Inspectorビューで座標を指定することもできる
とりあえずY軸方向に0.5を指定するとピッタリになる
https://gyazo.com/782a0517312cabfb95427fb91f3574c3
地面に色をつける
Assetsの中にMaterialsという名前でフォルダを作成
Materialsフォルダの中にMaterialを生成する.
名前は適当にBackgroundに設定した
Surface Input>Base Mapから色を適当に変更する
このMaterialファイルをドラッグ&ドロップでSceneビューの「Ground」に投げると色が変わる
https://gyazo.com/f4619d7d32cf9cddb0e8a64ed0c97a32
ディレクションライトの角度を調整する
たとえばY軸のRotationがデフォルトは-30だけど60くらいに変更するといい感じになる
お好きな角度でどうぞ
https://gyazo.com/e09405887d1df251fca5102b3f0ec27f
この状態では何も動かない
単にオブジェクトを配置しただけなのでこの状態でPlayボタンを押しても何も変化しない
https://gyazo.com/442bd8f8157717fa0a300e1ec38c0c97
球を物理エンジンで動くようにする
球(Player)オブジェクトを選択して,Inspectorビューから,Add Component>Physics>Rigidbodyを選択
意味はPhysics(物理学),Rigidbody(剛体)
https://gyazo.com/fd176f88ba983a5fe3f96ec784b8e6e2
Rigidbodyが設定されてるかどうかの違い
試しにRigidbodyのコンポーネントが設定されてる場合とない場合での動きの違いを出してみた
設定されてないと空中に移動させてPlayしてもそのままだけど,Rigidbodyがあれば重力によって落下する
https://gyazo.com/478339234d64893e9dd2a829f4a2cc34
キーボード操作で球を動かせるようにしていく
Assetsフォルダの中にScriptsフォルダを作成する
PlayerオブジェクトにAdd ComponentでNew Scriptを選択する
名前は適当にPlayerControllerに設定した
これでPlayerオブジェクトに関する動きはこのスクリプトを編集することでプログラムできるようになる
https://gyazo.com/1f1743c108729e6a0ffb3c99ef64b1ed
スクリプトを編集する
先ほど作ったPlayerControllerをダブルクリックするとエディタが起動する
https://gyazo.com/48d97401d46f3388498d959779021233
エディタはなんでも良いけどVisual Studioに変更しとく(どっちでもよい)
↑だとVSCodeが起動してるけど,おそらく.NET環境がないとか色々と言われると思うのが気持ち悪い
VSCodeはVisualStudio CodeのことだけどVisualStudioではない(何を言っているんだ)
ともかくUnityをインストールしたときにVisualStudioは入ってると思うので設定から変更しておく
設定>External Tools>External Script EditorからVisualStudio for Macを選択
https://gyazo.com/6bcebdedf7b6b9119dfcddb9f07f9323
デフォルト状態のコードを眺める
code:PlayerController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
UnityのAPI関連で困ったら「Cmd+'」でドキュメントを読みながら細かい使い方を調べるのが吉
今回はキーボード入力で球を動かしたいので
Inputをフォーカスして「Cmd+'」でドキュメントに飛んで,
GetAxisが良さそうだなぁと見つける
キーボード or ジョイスティックから水平垂直軸の入力を得る
本来はジョイスティックの縦と横の入力だけどキーボードの↑↓←→でもそれを仮想的に実現してる感じか.
ドキュメントの中で使い方の例とかもあるから参考にすると良い
https://gyazo.com/3accdd89bc7f4c0f9a9cb678391fd95c
コードを書く
code:PlayerController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private Rigidbody rb;
// Start is called before the first frame update
void Start()
{
// GUIの方でAdd ComponentされたRigidbodyを取得しておく
rb = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
}
void FixedUpdate()
{
// キーボード or ジョイスティックの入力を受け取る
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
// 三次元ベクトルを生成
Vector3 movement = new Vector3(moveHorizontal, 0, moveVertical);
// Playerに追加したRigidbody(剛体)に力を加える
rb.AddForce(movement);
}
}
動かしてみる
Playボタンを押すとスタート
キーボードの矢印ボタンで操作できる
https://gyazo.com/9da9d5e68b0edacb26c15108c0a9dd69
ちょっと感度が良くないのでもう少しスピードを出せるようにコードを修正する
speedという変数が増えてる
code:PlayerController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private Rigidbody rb;
public float speed;
// Start is called before the first frame update
void Start()
{
// GUIの方でAdd ComponentされたRigidbodyを取得しておく
rb = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
}
void FixedUpdate()
{
// キーボード or ジョイスティックの入力を受け取る
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
// 三次元ベクトルを生成
Vector3 movement = new Vector3(moveHorizontal, 0, moveVertical);
// Playerに追加したRigidbody(剛体)に力を加える
rb.AddForce(movement * speed);
}
}
Inspectorビューでspeedの値が入力できるようになってるので適当に変える
public変数はInspectorビューで変更できるようになることがわかる
50くらいで設定したら球がぶっ飛んだ
https://gyazo.com/4bd29aaf33182bdd6ac74f6561520e2e
カメラの位置を変えてみる
球の位置と同様にカメラの位置も変更できる
Sceneビューで矢印をいじったりInspectorビューで数字をいじったりすれば変更できる
どちらにせよグローバル座標で固定されている
ProjectビューでMain CameraをPlayerの下の階層にドラッグして移動させる
なんかおかしい
(動画だと間違えて一瞬Spotlight出てる気にしないで)
https://gyazo.com/32515b42091ad805cc1fdb7c4cbb846b
スピード落として再チャレンジ
Speedを5にして再チャレンジ
球の回転に合わせてカメラも回転してて明らかにおかしい
GoProを頭につけた人の映像みたいになってる
https://gyazo.com/1bd5352c97d5cc1cbec3437691b15afe
カメラの挙動を修正していく
まずはPlayerオブジェクトの下の階層に配置したMain Cameraは元の階層に戻す
次に,Playerオブジェクトの時と同様にMain Cameraを選択してAdd Component>New Scripsをする
スクリプトの名前は適当にCameraControllerにした
スクリプトは相変わらずAssetsフォルダに配置されてしまうのでドラッグ&ドロップでScriptsフォルダに移動させる
https://gyazo.com/631594c9f31b5f332fc51789a11fd3ab
コードを書き換える
以下のようにコードを書き換える
offsetは球とカメラの距離を表す
Startのときに初期値を計算して,LateUpdateでカメラの位置が維持されるようにカメラの位置を移動させる
code:CameraController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraController : MonoBehaviour
{
public GameObject player;
private Vector3 offset;
void Start()
{
offset = transform.position - player.transform.position;
}
void Update()
{
}
void LateUpdate()
{
transform.position = player.transform.position + offset;
}
}
書いたコードを動かす
InspectorビューでCameraControllerのpublic変数であるGameObjectがNoneになっているのでPlayerを選択しておく
Playボタンで実行する
今度は回転することなく球の動きに追従してカメラが動くことがわかる
球が回転しても球の座標との位置関係でカメラの位置が決まるのでさっきよりいい感じ
https://gyazo.com/87b00e5386e14adf3c3c2d63c2ad0774
プレイエリアに壁を作る
このままだとプレイエリアから球がすぐに落ちてしまうので落ちないように壁を作る
Plane(Background)とかSphere(Player)作ったのと同じ要領でCubeを4つ作る
Hierarchieビューで右クリック>3D Object>Cube
適当にWall1~Wall4の名前に変更した
場所は適当でよい
https://gyazo.com/12ddcf41dcec220bdb2d6a3e2d3b257f
壁のサイズと位置を調整する
各WallでInspectorビューのScaleとPositionをいじって適当なサイズに調整して壁になるように配置
囲えられれば適当でOK
https://gyazo.com/c625456fe985df256a804a33d7090e8f
https://gyazo.com/689891af59652dcd4d81beb5b16e486d
壁はグループにまとめる
Hierarchieビューを見るとWall1~4が他のPlayerやGroundと並列に並んでいるのが気持ち悪い
4つのWallオブジェクトで「壁」として考えた方がやりやすいから
Hierarchieビューで右クリック>Create Emptyで空のオブジェクトを作る
作ったオブジェクトをWallに名前を変えて,その下の階層にWall1~4を持ってくる
https://gyazo.com/c952cb31c437c5b3d90202df3b01c3f7
プレイしてみる
壁があるので下に落ちないようになった
https://gyazo.com/c73e100daae99927f510e1b279c6cbf7
プレイエリアをもう少し広くする
今のままだとプレイエリアが少し狭い気がしたのでサイズを大きくする
GroundのScaleを5x5にしてみた
https://gyazo.com/580dffe53bffc01e1081490778806ff1
壁のサイズと位置も調整する
https://gyazo.com/af20576511632129cb81976c6d405897
カメラの位置も調整する
ちょうどいい位置にカメラを移動させる
https://gyazo.com/1d3516beb09d2c8cbc744ac1a4dd00dc
拾うアイテムを作る
Hierarchieビューで右クリック>3D Object>Cube
名前は適当にPickUpに設定
角度(Rotation)を(45,45,45)でクリスタルっぽい感じで浮かせるように配置
とりあえず位置は適当で
https://gyazo.com/fb19c3c4d17c91f49b61ae36a4d92767
アイテムを動かすスクリプトを作る
アイテムは単に宙に浮いてるだけではなくて回転させるようにしてみる
PlayerのPlayerContoller.csとかMainCameraのCameraController.csと同じようにやる
HierarchieビューでPickUpを選択してInspectorビューからAdd Component>New Script
名前は適当にRotatorに設定した
https://gyazo.com/0c69da0822fa3484d95b7fb94aa390d4
コードを修正する
PickUpアイテムを回転させるように修正する
以下のように修正する
code:Rotator.cs
using UnityEngine;
public class Rotator : MonoBehaviour
{
void Start()
{
}
void Update()
{
transform.Rotate(new Vector3(30, 30, 30) * Time.deltaTime);
}
}
回転の方向が気に食わないので修正する
(45,45,45)の角度で浮いたPickUpオブジェクトをコマのように動かしたい
だけど軸がずれてるからどうしよう,ということ
これはWallのときの応用で,Create EmptyでPickUpItemを作成
PickUpをPickUpItem以下に移動させる
PickUpにつけたスクリプトはRemove Componentで取り外す(スクリプト自体は削除されない)
https://gyazo.com/32d23b7bf913a56f7236b63073439b06
PickUpItemを回転させる
PickUpオブジェクトのスクリプト(Rotator.cs)は外して,代わりにPickUpItem側にくっつける
Rotator.csの中身を以下のように書き換える
そうすればちゃんとコマのように回るはず
code:Rotator.cs
using UnityEngine;
public class Rotator : MonoBehaviour
{
void Start()
{
}
void Update()
{
transform.Rotate(Vector3.up * 30 * Time.deltaTime);
}
}
https://gyazo.com/9239acb0f3b01c671fa43fb32779cfdd
よくよく考えればEmptyオブジェクトなくてもやれそう
↑でやってるようにEmptyオブジェクトにPickUpを入れてY軸に対して回すという処理をすることは割とシンプルでよかった
だけど,そもそもPickUp単体で角度を調整すればその場でコマのように回転させることはできそう.
PickUpが(45,45,45)の角度になってるってことは,軸の方向ベクトルとしては(1,1,-1)の軸で回転すればできそう
PickUpItemの下の階層にあるPickUpを上の階層に戻して,PickUpItemオブジェクトは削除してしまう.
PickUpオブジェクトに前に作ったRotator.csのスクリプトをコンポーネントとして追加する
Rotate関数の部分をtransform.Rotate(new Vector3(1,1,-1), 30 * Time.deltaTime)とする
https://gyazo.com/ebf8cbd27a94880b9ecee0fea869dfad
アイテムをテンプレート化させる
さて,この回転するオブジェクト
同じようなPickUpオブジェクトをたくさん作りたいけど,1つずつ設定をしていくのは非常に面倒
Prefab(プレハブ)という機能を使ってさっき作ったPickUpオブジェクトをテンプレート化させる
Prefab用にAssets以下にPrefabsというフォルダを作成する(動画だとPrefabになってるけど)
HierarchieビューにあるPickUpオブジェクトをPrefabsにドラッグ&ドロップで入れる
するとPrefabになる.とても簡単
https://gyazo.com/621cd6e20d29fb9699eddf558f80c7f4
PickUpオブジェクトを複製する
全体を見渡せるように,真上から俯瞰するようにシーンビューから見える角度を変えておく
どこからやってもいいけど,PickUpオブジェクトを選択して
Edit>Duplicate
Hierarchieビューで右クリック>Duplicate
Cmd+D
とかで複製する.
普通にマウスで移動させるとPickUpオブジェクトの軸が(45,45,45)になってる関係で移動させたくても軸方向に斜めに動いてしまうので,Sceneビューの左上のところ(Tool Handle Rotation)をLocal>Globalに変更する
これでマウスで動かすと真横にスライドするように動かせるはず
適当にたくさん複製をして,適当に並べる.
https://gyazo.com/5c33cd19bb53cddfcb3d114dd4d5f5c7
動かしてみる
PickUpの複製は10個くらい作った
動かしてみる
ちゃんと動いてるけど,球がぶつかるとぶつかるだけで何も起きない
https://gyazo.com/b53b8fdc12f03b6cfe0697630c73e96a
PickUpに色をつける
Groundに色をつけたようにPickUpにも色をつけていく
Materialsの中のGroundを複製して適当に色を変える
PickUpという名前のマテリアルを作成して黄色に設定した
https://gyazo.com/8ed645916b91633c6c73e7623d4b1005
すべてのPickUpに適用させる
GroundのときのようにProjectビューのMaterialsにあるPickUpをドラッグ&ドロップでPickUpオブジェクトに適用させる
色が黄色に変わるかず
変わったPickUpオブジェクトを選んで,InspectorビューでPrefabの項目>Overrides>Apply All
すべてのPickUpアイテムの色が変更された
https://gyazo.com/efab58f2b304d020d009cfb859ff5fec
PlayerがPickUpオブジェクトに衝突した際の動きを実装していく
今はぶつかったらぶつかるだけ.マリオのコインみたいにぶつかったらPickUpは消したい
PickUpオブジェクトのPrefabに"PickUp"というタグをつける
Projectビュー>Assets/Prefab/PickUpを選択する
InspectorビューでTagがUntaggedになっていると思うので,それを選択してAdd Tagを押す
InspectorビューでTagsが出てくるので「+」ボタンを押して"PickUp"という名前にする
PrefabのPickUpオブジェクトを選択して,先ほどUntaggedだったものをPickUpに変更する
するとほかのすべてのPickUpオブジェクトにも同様にTagがつく
PlayerオブジェクトについてるスクリプトPlayerController.csを開いてコードを以下のように加筆する
code:PlayerController.cs
...
...
...
void FixedUpdate()
{
// キーボード or ジョイスティックの入力を受け取る
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
// 三次元ベクトルを生成
Vector3 movement = new Vector3(moveHorizontal, 0, moveVertical);
// Playerに追加したRigidbody(剛体)に力を加える
rb.AddForce(movement * speed);
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("PickUp"))
{
other.gameObject.SetActive(false);
}
}
}
https://gyazo.com/f6e2a1a554e598aa70637d971f67f476
コードを眺める
とりあえず,今回の例では静的コライダーと動的コライダーを把握しておくとよさそう.
静的コライダー
床とか壁とか静的なオブジェクトのコライダー=Rigidbodyでは無いもの
Rigidbodyのオブジェクトと衝突するが,衝突しても動いたりはしない
動的コライダー
Rigidbodyが適用されたオブジェクトのコライダー
トリガーとコライダー
OnTriggerEnterとOnCollisionEnterの違いを理解しておくと使い勝手が広がる
雑に言えばTriggerだと判定だけしてすり抜ける,Collisionはぶつかって判定する感じ
参考になる記事がたくさん出てくる
PrefabのPickUpオブジェクトにIs Trigger属性を設定する
ProjectビューでPrefabのPickUpオブジェクトを選択
Inspectorビュー>Box Collider>Is Triggerにチェックを入れる
すべてのPickUpオブジェクトにもIs Trigger属性がつく
トリガーに設定すると衝突時に発生する反発効果がなくなる.すり抜けられるようになる
Playボタンで起動
PlayerがPickUpに衝突すると消える
すり抜ける前にActiveをfalseにしてるからね
https://gyazo.com/9b754441507dd53f6dfd766124f2a75f
試しにRrefabのPickUpオブジェクトにRigidbodyをつけるとどうなるか
RrefabのPickUpオブジェクトにAdd ComponentからRigidbodyをつけてみる
Playボタンから起動
PickUpオブジェクトたちは床を突き抜けて落ちてしまう
これはIs Triggerがオンになっているから,物理衝突が無視されてすり抜けてるから
https://gyazo.com/078424b61ea1ec8f72790ce330a29663
もしもRigidbodyがある状態でさっきと同じことをしたい場合
とりあえずPrefabのIs Triggerをオフにする
これで床をすり抜けることはなくなる
だけど床に転がってしまう
RigidbodyのUse Gravityをオフにする
これで重力の影響を受けなくなって空中でちゃんと回転する
https://gyazo.com/5fb8f7df830d38cf48bd3e3e8ffeee22
動かしてみる
Playボタンで起動
いい感じのように見えてぶつかると宇宙空間でぶつかったみたいに飛んでっちゃう
https://gyazo.com/a58c430da72a27bedc8c91c3ff706413
PrefabのPickUpオブジェクトの物理演算を無効化する
PickUpにRigidbodyをつけたので物理演算されてぶつかったら飛んでっちゃう問題があった
InspectorビューでRigidbodyの中のIs Kinematic属性をオフにすることで物理演算を無効化できる
これでPlayボタンで起動する
PickUpが飛んでいかないけど,ぶつかっても消えない
https://gyazo.com/cf6c80fa8f56b0a99684132cba25a3ff
原因はTriggerとCollisionの違い
今のコードではPlayerController.csでOnTriggerEnterで判定させてるけど,さっきPickUpのIs Triggerをオフにしてしまったので,今はトリガーが無い状態.なのでこのメソッドは呼び出されない.
代わりにRigidbodyにしてCollisionの判定をして消すという方法に切り替えてみる
PlayerController.csを書き換える
OnCollisionEnterで消えるように書き換える
前のコードは残したままで良いので,OnTriggerEnterと同じようにOnCollisionEnterのコードを書き加える
中身の処理はOnTriggerEnterと全く同じ(引数がcollisionに変わっているのに注意)
code:PlayerController.cs
...
...
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("PickUp"))
{
collision.gameObject.SetActive(false);
}
}
...
...
https://gyazo.com/53f3019b9211dc45bc78b69f9b904d50
動きをよく見ると,すり抜けずにぶつかってから消えてる
Triggerを使って実装してた時と動きが違うのがわかる
衝突の判定をしてから消すので,Playerに反発があるのがわかる
どのような実装が良いのかはその時の状況に応じて使い分ける
https://gyazo.com/0723610f2b23f921b58e29eeb21f7c61
元に戻しておく
PrefabのPickUpオブジェクトからRidigbodyを削除
PrefabのPickUpオブジェクトでBox Collider>Is Triggerをオン
PlayerController.csのOnCollisionEnterの部分を削除
拾ったアイテムの数を数えていきたい
PlayerController.csを編集する
拾ったアイテムの数を数える変数int countをPlayerController.csに追加
オブジェクトを消す処理の時にカウンタを1増やす処理を加える
code:PlayerController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private Rigidbody rb;
public float speed;
private int count; // ここを追加
void Start()
{
rb = GetComponent<Rigidbody>();
count = 0; // ここを追加
}
void Update()
{
}
void FixedUpdate()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0, moveVertical);
rb.AddForce(movement * speed);
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("PickUp"))
{
other.gameObject.SetActive(false);
count++; // ここを追加
}
}
}
https://gyazo.com/7e35600adcbc5e86361da627b84a855b
画面に表示するためのテキストオブジェクトを作成
Hierarchieビューで右クリック>UI> Text - TextMeshProを選択
ProjectビューでCanvas以下にText(TMP)というオブジェクトができているはず
初回時は,色々とインポートしてくれと言われると思うので,Import TMP Essential, Import TMP Examples & Extrasのボタンを押してインポートしてしまおう
https://gyazo.com/e38d1b30efb8762f077ff4f628a516dc
日本語入力ができない
Text(TMP)オブジェクトを選択してInspectorビューのText Inputで適当な文字を入れてみる
残念ながらそのままだと日本語入力ができなさそう.文字化けしてる
https://gyazo.com/316615b79cbcdab44b36829408afb1e5
AssetsフォルダにFontsフォルダを新規作成
https://gyazo.com/6ef5521f44b621f65dd15be4fe7109b7
適当なフォントを取ってくる
ttfファイルをAssets>Fontsの中にドラッグ&ドロップする
別のフォントならotfとかかもしれない
https://gyazo.com/66af0d2e45e178cd3e9e7bb5829df68c
日本語フォントを変換する
Window>TextMeshPro>Font Asset Creatorを開く
Source Font Fileにはさっきダウンロードしてきたttfファイルを選択
Atral Resolutionは最大にしてみた
Character SetはASCII→Custom Charactersに変更
Custom Characrers Listのテキストボックスに使いたい文字をぶち込む
とりあえず日本語で使う文字をすべて入れていく
Ger Kerring Pairsはどっちでも良い気がするがとりあえずOnにしてみた
Generate Font Atlasを実行
完了したらAssets/Fonts以下に保存する
参考
https://gyazo.com/65b9ef49c600817fd462912ef08c6693
動作確認
Projectビュー>Text(TMP)を選択
InspectorビューでFont Assetsを先ほど生成したDotGothic16に変更
すると日本語が表示できるようになっているはず
https://gyazo.com/218bb78bf2db6e10704a5da838466bac
文字の位置を調整する
とりあえず適当な場所に配置する
https://gyazo.com/0627dcd501b3ab9c6c6dda458a004c06
テキストの中身を書き換える
PlayerController.csの中身を書き換える
InspectorビューでcountTextオブジェクトをTextに紐づける
https://gyazo.com/020fc544864f44e01f28322bea3e3309
code:PlayerController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro; // ここを加える
public class PlayerController : MonoBehaviour
{
private Rigidbody rb;
public float speed;
private int count;
public TextMeshProUGUI countText; // ここを加える
void Start()
{
rb = GetComponent<Rigidbody>();
count = 0;
countText.text = "スコア: " + count.ToString() + "点"; // ここを加える
}
void Update()
{
}
void FixedUpdate()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0, moveVertical);
rb.AddForce(movement * speed);
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("PickUp"))
{
other.gameObject.SetActive(false);
count++;
countText.text = "スコア: " + count.ToString() + "点"; // ここを加える
}
}
}
テキストを書き換える部分が賢くないので関数化する
今回は2箇所だからいいものの,フォーマットを変えたいときとかにすべての場所でテキストを変えるのは面倒
countTextを書き換える部分をSetCountText()にまとめる
code:PlayerController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class PlayerController : MonoBehaviour
{
private Rigidbody rb;
public float speed;
private int count;
public TextMeshProUGUI countText;
void Start()
{
rb = GetComponent<Rigidbody>();
count = 0;
SetCountText();
}
void Update()
{
}
void FixedUpdate()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0, moveVertical);
rb.AddForce(movement * speed);
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("PickUp"))
{
other.gameObject.SetActive(false);
count++;
SetCountText();
}
}
void SetCountText()
{
countText.text = "スコア: " + count.ToString() + " 点";
}
}
すべてのアイテムを拾い終えたら「Finish!」メッセージ出したい
Finish!を出すTexeMeshProを作成
https://gyazo.com/9421f27577339e4e2069a8fbda8a0b56
Finish!の部分のスクリプトを書く
スタート時は空白にしておく
countが10以上になったらFinish!のテキストを出す
https://gyazo.com/720bbdc73695caa1b015cd1aefed6442
ビルドする
https://gyazo.com/af10c0dac24969a09c216c7d2a4a5081
ビルドしたゲームをプレイする
なんかスコアの文字の位置がおかしい
https://gyazo.com/ce5284d286ad6b34fe0892a5622e1740
スコアの文字の位置を調整する
https://gyazo.com/495dd1f0ae70fbc0ffbe98661ac54768
再ビルドしてプレイする
https://gyazo.com/22d270a79dff3656d28bd28413c0363b
TODO:パラメータの諸々を調整する
Playerの移動速度とかサイズとか
カメラの位置
PickUpの個数,位置,色,形,回転速度
等々,ここまで出てきた内容でちょうど良い感じに調整をする
shinyaoguri.iconお疲れ様でした
ここまでのコードが気になる人は
ここにコードを置いておきました