名称
- インスペクターウインドウの1つ1つの▷の項目のことをコンポーネントという
Unityのウィンドウ名
- ヒエラルキーウインドウ(オブジェクトを作る際に使用。作成しているものを実際に映し出してくれる)
- シーンビュー(実際にゲームを作る際に使用)
- インスペクターウインドウ(オブジェクトの細かい情報が載っている)
- プロジェクトウインドウ(ファイルなどの管理をする)
- コンソールウインドウ(プログラムの動作を確認するためのウインドウ。今ここまで動作してますよ~とかフラグの中身の確認とか。)
基本操作
- オブジェクトのコピー → ctlr+Dで複製
- オブジェクトの削除→選んでdelete
- オブジェクトの拡大→スケールツール。全体を大きくするなら真ん中の灰色の□
- アタッチ→作成したC#のプログラムを選択し、それを適用したいオブジェクトへドラッグ&ドロップ。(アイコンが変化した状態で左クリックを放す)と、書いた内容が適用される
その他あれこれ
- ゲームのお試しプレビュー画面はカメラのアイコンをクリックして画角を調整することが可能
- オブジェクトの名前の変更はインスペクターの一番上あたりで変更可能。基本的に英語の名前で頭文字が大文字である方が良いらしい
- 変数名++;という表現方法は、変数名に+1ずつしますと言う意味
- ヒエラルキー画面の「Directional Light」はライトの色を変えてくれる
- A+=BとA=A+Bの書き方は同じ
例)transform.position += Vector3.right;
transform.position = transform.position + vector3.right;
ゲームビューとレイアウトについて
ウインドウは自由に並び替えられる。自分なりに良い配置が出来たら、画面右上のデフォルトのところから「レイアウトを保存」でそのレイアウトを保存することができる。
カメラのアイコンを触ると視点が変わるので、調整もしてみよう。
オブジェクトの親子関係を作ってヒエラルキーウインドウを整理整頓、まとまりとして作りたいとき
オブジェクトを大量に配置した場合、ヒエラルキーウインドウで親子関係を作り管理することが出来る。
右クリック→空のオブジェクトを作成→インスペクターの一番上の部分で名前を付けることが出来る(わかりやすく)
ヒエラルキーウインドウ内でその中に入れたいものを選択し、先ほど作った空のオブジェクトへとドラッグアンドドロップ。するとグループ化=親子関係を作ることが出来て便利。
一気にまとめて全体を動かすことも可能。形状を組み合わせてひとつのものにしたいときとか。
Canvas(文字表示)について
ヒエラルキーウインドウで右クリック→UI→キャンバスで配置
キャンバスを右クリック→UI→テキスト
※キャンバスの親子関係としてテキストを入れることが大事!
ヒエラルキー画面内のキャンバスをダブルクリックで全容を見ることが出来る。tmpimporterが出て来たらimportすればOK
テキストをクリックし、インスペクタータブの真ん中あたり、「New Text」と書いてある部分を書き換える
※枠外に出ない様にするには、真ん中あたりのテキストブロック内にある少しスクロールした先にあるoverflowをOverflowに変更しておくのがGOOD。もしも設定しないまま文字数をオーバーした場合、何も表示されなくなってしまうので。
テキストをスクリプトから書き換える
流れ
テキストを入れる変数を作るコードを書く→どれでも良いので適当なオブジェクトにアタッチする→作っておいたテキストオブジェクトをインスペクター内の最下部あたりにある、先ほど作ったばかりの公共変数の場所へドラッグ&ドロップ(この際ドラッグ&ドロップが利かない場合があるが、バージョンが異なる為。以下説明用に2パターン用意しておく)→何かアクションがあったら書き換えるスクリプトを追記
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro; //書き足す!キャンバスの内容をいじる時必須
//unityにあらかじめ登録されている機能を呼び出します
//わりかし新しいバージョンでテキスト(TMpro)の場合
//(これが古いバージョンの場合)↓
//using UnityEngine.UI;
public class test : MonoBehaviour
{
public TextMeshProUGUI message2; //テキストを入れる変数
//(これが古いバージョンの場合)↓
//public Text massage2;
void Start()
{
}
// Update is called once per frame
void Update()
{
//スペースキーが押されたら書き換えましたと書き換えるプログラム
if (Input.GetKeyDown(KeyCode.Space)) {
message2.text = "書き換えました";
}
}
}
public変数を使わない別の方法
Textって名前を付けたオブジェクトを探してきて、ヒエラルキー内にあるText欄の内容をゲットしてくるという方法もあるらしいが上手く行かなかった…。バージョンの違いがあるんだろう
message2 = GameObject.Find("Text").GetComponent<Text>;
スコアの書き換えをする
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor.VersionControl;
using TMPro.Examples;
using Unity.VisualScripting;
using UnityEngine.UI;
//unityにあらかじめ登録されている
//機能を呼び出します
public class test : MonoBehaviour
{
private int score;
Text message2;
Text score2;
void Start()
{
message2 = GameObject.Find("Text").GetComponent<Text>();
score2 = GameObject.Find("score").GetComponent<Text>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space)) {
message2.text = "書き換えました";
}
// Aが押されたら
if (Input.GetKeyDown(KeyCode.A))
{
score++; //1ずつ増やす
score2.text = "score:" + score;
}
}
}
日本語対応させる(文字が□□にならないように)
文字が□□□みたいな感じになるのは、日本語対応しているフォントではないから。日本語を入れる必要がある。方法はここを見ながらやった。他のだと上手く行かなかったけどこの方法なら。
まずはグーグルフォントからフォントをダウンロード→Unityで作ったゲームファイルの中にAssetsというフォルダがあるのでその中に入れる。UnityのメニューのウインドウからtextMeshpro→フォントアセットクリエイター→sourcefontfileの部分を先ほどダウンロードしたファイルに変更→sampring~をCustom Size73にする→Atlas Resolutionを8192と8192に変更→CharacterSetをCustom Charactersに変更→CustomCharacterListのところに、ダウンロードしてきたテキストファイルの中身をコピペ→Generate FOnt Atlas→saveでAssetsフォルダの直下にセーブ。
使用方法→↑のやり方でテキストを配置したら、テキストをクリックしてインスペクターを開き、Font Assetの中にある先ほどダウンロードしたファイルを選択する。
スクリプトの組み方
プロジェクトウインドウの空きスペースを右クリック→作成→C#スクリプト→そのままファイル名の変更(ここで変な操作をすると変な風になるので注意!作ったら即名前変えられるのでそのまま変更しよう)→ヴィジュアルスタジオが開いたら、まずはタブを確認して名前をチェックする。その名前と、
public class ココの名前が一致 : MonoBehaviour
{
ココの名前が一致というところが一致していたらOK。してなかったら変な風になってるかも。
- コメントアウト→//
- class→機能のまとまりのこと
void Start()
{
}
これは、最初にスタートした瞬間1回読み込まれるプログラムをここに書く
void Update()
{
}
これは、1フレーム(約0.02秒)ずつ毎回呼ばれるプログラム
オブジェクトを動かすプログラム(Update()内に書くとずっと動く)
//transform→unityでもあるトランスフォームウインドウにもありますが、位置や回転などの情報をいじりますよという宣言
//Translat→指示された場所にポジションを動かしますよという宣言
//(Vector3.fwd).fwd→前方向(z方向)に進む。back(後ろz)やleft(x)やright(x)やup(上 y軸)やdown(下 y軸)も使用可能
transform.Translate(Vector3.forward);
//速度を調整したい(下の例だと0.5倍=半分にする)(0.1で10分の1)
transform.Translate(Vector3.forward * 0.5f);
変数を使う
- public → 共通(公共)の変数(Unityのインスペクターの画面上に表示されるようになるし、Unityの画面上で中身を変えることが出来る!!!これは凄い…。マクロみたいに何度も使いたい機能など共通のものはpublicにしておいた方が便利)
- private → 各プログラムだけの中の変数。
設定を省略するとprivate扱いになる。区別しやすくするために、出来るだけprivateも書いておこう。
public 変数の型 変数名;
↑変数の中身を宣言しない(変数の中身が空になる)ことによって、Unity側で設定した値が設置されるようになる
public class プログラム名 : MonoBehaviour
{
float speed = 1.5f;
//↑speedという名前の数字型(小数)変数をここで設定
void Start()
{
}
// Update is called once per frame
void Update()
{
//速度を調整したい(下の例だと0.5倍=半分にする)(0.1で10分の1)
transform.Translate(Vector3.forward * speed);
//変数名をそのままぶち込んでOKなのね
}
}
IF文を使う
比較演算子
<,>,><=,>=, !=(等しくない),==(等しい),+,-,*,/,%(剰余演算子)
//↓の条件は、トランスフォームウインドウのポジションのzの値が30以上になったら引き返してくる処理を行う
if (transform.position.z >= 30)
{
//条件をクリアした場合の処理
//変数上で処理をする。↓の場合、-○○に設定しなおされる
speed = -speed;
}
ifの中にこれ
transform.Translate(Vector3.forward * -0.1f);
を書けば戻って来るのでは?と思ったけど、よく考えたらこれ一回だけちょっと戻るだけでマイナス要素は指定出来てないので、zの値が29.9のまま処理が止まってしまった…。
オブジェクトの消滅(Destroy デストロイ)
void Update()
{
//速度指定
transform.Translate(Vector3.forward * speed);
if (transform.position.z >= destoroipoint)
{
Destroy(gameObject); //このクラスをアタッチしている
オブジェクトを消滅させるという命令文
}
}
Rigidbodyを使用する(オブジェクトに動きを付ける)
Rigidbodyを使うとオブジェクトがぶつかるようになる。
ヒエラルキータブでオブジェクトを選択→インスペクタータブの最下部にあるコンポーネントを追加→様々な動作を付ける(ex)Rigidbodyというのは落下物理演算)
C#でrigidbodyを使う
落ち方に工夫をする
ただ動かすだけではなく、動作を多彩に出来る。
public class play : MonoBehaviour
{
public int power; //力の調整の変数宣言
Rigidbody player; //rigidbodyを入れる為の型と変数playerを宣言
void Start()
{
player = GetComponent<Rigidbody>();
//playerという変数の中にゲームが始まった瞬間
//コンポーネントを捕まえて来て入れる。
//その時のコンポーネントはrigidbodyですよと言う意味
player.AddForce(Vector3.forward * power);
//playerの中にはrigidbodyが入っていて、力を加えます(AddForce)よ。
//手前の方(z)に動きますよ。
}
// Update is called once per frame
void Update()
{
}
}
十字キーやスペースを押すことで動きを付ける
public class play : MonoBehaviour
{
public int power; //力の調整の変数宣言
Rigidbody player; //rigidbodyを入れる為の型と変数playerを宣言
void Start()
{
player = GetComponent<Rigidbody>();
//playerという変数の中にゲームが始まった瞬間
//コンポーネントを捕まえて来て入れる。
//その時のコンポーネントはrigidbodyですよと言う意味
//player.AddForce(Vector3.forward * power);
//playerの中にはrigidbodyが入っていて、力を加えます(AddForce)よ。
//手前の方(z)に動きますよ。
}
// Update is called once per frame
void Update()
{
//十字キーで動かす
if (Input.GetKey(KeyCode.RightArrow)) //右矢印キーが押されたら
{
player.AddForce(Vector3.right);
//右に動く
}
if (Input.GetKey(KeyCode.LeftArrow)) //←矢印キーが押されたら
{
player.AddForce(Vector3.left); //←に動く
}
if (Input.GetKey(KeyCode.UpArrow)) //上矢印キーが押されたら
{
player.AddForce(Vector3.forward);
//奥に動く
}
if (Input.GetKey(KeyCode.DownArrow)) //上矢印キーが押されたら
{
player.AddForce(Vector3.back); //手前に動く
}
if (Input.GetKeyDown(KeyCode.Space)) //スペースキーが押されたら
{
player.AddForce(Vector3.up * power);
//上に動く
}
}
}
- 手前に動かしたい→back
- 奥に動かしたい→foward
- 上に動かしたい→up
- 下に動かしたい→down
クローンをつくる prefab(プレハブ・プリファブ)★これ大事
作ったオブジェクトをプログラムとか作成するアセッツassets画面にドラッグ&ドロップするとそのオブジェクトが表示される=プリファブ。それをまたヒエラルキーに投入すると大きさや色などを色々と変えたいときなどに一括して変更することが出来る。ヒエラルキーに投入したアイコンが青くなる。敵キャラなどが複数居て同じ見た目の時などに調度いい。
当たったら消える、などの処理もプリファブの元にさえ付け足せば簡単に消せるようにできる。(機能なども全部一緒になる)
大きさなどを変更したものをすべてのプリファブに反映させたい
複数配置したプリファブを後からサイズ変更などステータス変更した時、すべてのオブジェクトに反映するようにするには、まずインスペクターの一番上の方(上から3番目くらい)に「オーバーライド」というのがあるのでそれをクリック→「すべてを適用する」を選択するとプリファブが一気に変更される
スペースキーを押したら玉を発射するゲームを作る
・玉にはまっすぐ進む動作を付けるだけ
・玉をプリファブにしてクローンにし、スペースキーが押されるたびに増産されるようにする
・プレイヤー側にはinstantiate(クローンを発生させる)をつける
玉の方の処理(前に飛んでいくだけ)
public class tama : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{}
// Update is called once per frame
void Update()
{
transform.Translate(Vector3.forward);
}
}
プレイヤー側の処理
public class Player : MonoBehaviour
{
public GameObject tama; //ゲームオブジェクトを入れる箱「tama」を作り
//インスペクターからいじれるように
void Start()
{}
// Update is called once per frame
void Update()
{ }
}
この後、プレイヤー側にコードをアタッチし、インスペクターウインドウの下の方にある、パブリックで指定しているtamaのところへとプリファブ(玉)をドラッグアンドドロップする。(プレイヤーにプリファブとしてtamaを登録した)そしてオブジェクトの方の球を消去する。
public class Player : MonoBehaviour
{
public GameObject tama; //ゲームオブジェクトを入れる箱「tama」を作り
//インスペクターからいじれるように
void Start()
{
}
// Update is called once per frame
void Update()
{
//もしもスペースキーが押されたら
if (Input.GetKeyDown(KeyCode.Space)) {
//instantiate(発生させる)(何を(tamaを),
//trans~どこに(プレイヤーの今のポジションと同じ方向に),
//方向は?(quater~)identity=変更を加えない
//3つの要素がinstantiateにはある(発生させるもの,場所,向き)
Instantiate(tama, transform.position, Quaternion.identity);
}
}
}
球を発射して敵を消す!
ポイント!
rigidbodyを付けてないとたとえ当たったとしても消えないよ!
(この場合、球の方にrigidbodyを付ける)
球を一直線に飛ばしたいときは「重力を使用」のチェックを外すとよい
・球も敵に当たったら消えるようにする
・プレイヤーを上下左右で移動できるようにする
・敵を作って、当たったら消えるようにする
敵のコード
public class Enemy : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
private void OnCollisionEnter(Collision collision)
{
Destroy(gameObject); //当たったら消える
}
}
球のコード
public class tama : MonoBehaviour
{
void Start()
{
}
void Update()
{
transform.Translate(Vector3.forward); //前へ進む
}
private void OnCollisionEnter(Collision collision)
{
Destroy(gameObject); //当たったら消える
}
}
プレイヤーのコード
public class Player : MonoBehaviour
{
public GameObject tama;
void Start()
{
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space)) {
Instantiate(tama, transform.position, Quaternion.identity);//スペースで球を発生させる。場所とか色々指定(前述詳細説明)
}
if (Input.GetKeyDown(KeyCode.RightArrow))
{
transform.position = transform.position + Vector3.right;
//今のプレイヤーの位置を今の位置から一歩足す
}
if (Input.GetKeyDown(KeyCode.LeftArrow)){
transform.position = transform.position + Vector3.left;
}
if (Input.GetKeyDown(KeyCode.UpArrow))
{
transform.position = transform.position + Vector3.forward;
}
if (Input.GetKeyDown(KeyCode.DownArrow))
{
transform.position = transform.position + Vector3.back;
}
}}
オブジェクトの色とか模様を変える(material)
色を変える↓
プロジェクトウインドウ→右クリック→マテリアル→名前を付ける→インスペクターウインドウの上の方にあるカラー変更から設定→アタッチ→コンポーネントとして追加される(コンポーネントから変更も可能)
テクスチャを付けたい場合↓
assets(プログラムをいつも作る場所)にテクスチャとして貼り付けたいものを投入する→画像を選択しインスペクターウインドウの上の方にある「テクスチャタイプ」を「スプライト」に変更。適用的なものを押す。→そのテクスチャを貼り付けたいマテリアルを選択し、先ほど選んだインスペクターウインドウの上の方にあるカラー変更のアルベドって書いてあるすぐ左にある真四角のアイコンのところに画像をドラッグ&ドロップする。
オブジェクトがぶつかったら消えるプログラム
public class cube : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
//書く場所に注意!!
private void OnCollisionEnter(Collision collision) //ぶつかったら消える命令文
{
Destroy(gameObject);//このゲームオブジェクトを消滅させる
}
}
↓これをプレイヤーがぶつかった時限定にしたいとき。
プレイヤー側として指定しているオブジェクトを選択→インスペクターウインドウの一番上のあたりにタグというものがあるので、なんでも良いので指定する(この場合"plyaer")
上のスクリプトをこんな風に書き替える。こうしないと例えば敵同士などがぶつかっても消えるようになってしまう為
private void OnCollisionEnter(Collision collision) //ぶつかったら消える命令文
{
if (collision.gameObject.CompareTag("player"))//playerというタグがあるオブジェクト限定で~という条件の下
{
Destroy(gameObject);//このゲームオブジェクトを消滅させる
}
}
Sceneビューの操作方法
- 平行移動…マウスホイールをクリックしながらマウスを動かす
もしくはalt+ctrl
ツールの手のひらマークも同じ働きをするのでこっちの方が便利っぽい…? - その場から動かず視点移動…altキーを押しながら左クリック
もしくは右クリックしながらマウスを動かす - ズームイン・ズームアウト…マウスホイールを前後に動かす
インスペクタータブのトランスフォームで具体的な数値を打ち込むことも可能
オブジェクトを配置する
ヒエラルキータブで右クリック→配置したいものを選択
動作をテストする
画面中央上あたりにある▷ボタンとか
地面を作る
ヒエラルキータブで3Dオブジェクト→平面をクリック
簡単に大きさを大きくしたいなら、インスペクター画面のスケールの値を、例えばx10とか(10倍)にすると良い。