
今回は【2D】で宝箱からカギをGETして扉を開ける方法について勉強するッピ!

宝箱からカギをGETして扉を開ける方法?

まだ習ったことないわ!

今回の勉強で、
宝箱や鍵といったオブジェクトの設定
他のスプリクトから変数を呼び出す方法
が学べるッピ!

これからこの宝箱からカギをGETして扉を開ける方法を一緒に勉強して行くッピよ~
宝箱からカギをGETして扉を開ける方法を学ぼう
必要なもの

まずは必要なものを用意するッピ!

- Unity
- Windows または Mac のパソコン
が必要ッピよ~!

まだ Unity をダウンロードしてない人は
↓ の記事を参考に必要なものをインストールするといいッピ!

その他には

- 動けるマップ
- 操作できるキャラクター
- 扉の画像
- 宝箱の画像(開)
- 宝箱の画像(閉)
も必要ッピよ~!

準備できたッピか?
それじゃあさっそくやっていくッピ♪
扉と画像を用意する

さっそく扉と画像をUnityに登録するッピ!


アセットに気に入った画像を
ドラッグ&ドロップするッピよ~

オッケー


登録した画像のサイズを設定するッピ!

インスペクター→スプライトモード→
単位毎のピクセル数を【32】
に設定するッピよ~

宝箱の画像も忘れちゃダメッピ!

できたわ!
画像をヒエラルキーへ登録

次は
画像をヒエラルキーへ登録
するッピ!


宝箱(閉)画像をヒエラルキーへドラッグ&ドロップ
好きな場所に画像を変更&ドアのレイヤー順序を整えるッピ!


扉オブジェクトもヒエラルキーに登録
するッピよ~

できたわ!
質量と当たり判定
当たり判定の追加

キャラと宝箱がぶつかって
イベントを起こすには、
質量と当たり判定
が必要っピ!


まずヒエラルキーのドアを選択して、
インスペクター→コンポーネントを追加→Physics2D→BoxCollider2D
を選択するッピ~

当たり判定を調整するときは
インスペクター→CapsuleCollider2D→コライダー編集
からできるッピよ~
質量の追加


次は質量を追加するッピよ~
インスペクター→コンポーネントを追加→Physics 2D→Rigidbody 2D
を選択するッピ~

インスペクターから
Rigidbody 2D→ボディタイプ→静的
を選択するッピ!

この「静的」とか「ドラマティック」とかって何なんだ?

これは、
外部からの「ちから」が働くかどうか?
を決める項目ッピ!
状態 | 重力 | 質量 | 力 | 速度 | |
---|---|---|---|---|---|
Dramatic (ドラマティック) | 外部から力を受ける モノを動かす | ○ | ○ | ○ | ○ |
Cinematic (キネマティック) | 外部から力を受けない モノを動かす | ✕ | ✕ | ✕ | ○ |
Static (静的) | 外部から力を受けない モノを動かせない | ✕ | ✕ | ✕ | ✕ |

へー
こうなってるのか

勉強になったわ!

宝箱にも同じように
当たり判定と質量
を追加するッピ!

プレイヤーの設定
プレイヤーのタグづけ

次はプレイヤーのタグづけをするッピ!

タグ付け?

タグづけは、
●●がXXに当たったら、
▲▲というプログラムを起動する
というプログラムを組みたいときに●●やXXを判別するものッピ!

今回のタグ付けは
プレイヤーがNPCに当たったら、
会話というプログラムを起動する
というプログラムを組むためにタグづけしていくッピよ~!

そんな機能があるんだなー


まず
プレイヤーをクリック
するッピ~
プレイヤーの当たり判定/質量の追加

プレイヤーの当たり判定をつけるッピ!
すでに当たり判定がついている場合は次のステップに行くッピよ~


まず
プレイヤーをクリック
するッピ~

それからインスペクター
コンポーネントを追加→Physics2D→Circle Collider2D
を選択するッピ~


質量を追加するッピ!
インスペクターから
コンポーネントを追加→Physics2D→Rigidbody 2D
を選択するッピ~


重力や抵抗を設定するッピよ~!
インスペクターから
Rigidbody 2D
を選択するッピ~

そこから
リニアの抵抗0
回転抵抗 0
重力スケール 0
と入力し、
回転を固定 ☑Z にチェックを入れる
ッピよ~

できたわ!
宝箱のプログラムを組む

これから宝箱のプログラムを組むッピ!


宝箱を選んだまま
インスペクター→コンポーネントを追加→New script→【treasure】と名前をつけるッピ!
そのままC#スクリプトをクリックしてスクリプトを編集するッピよ~

↓の文をコピーして
using UnityEngine;
public class treasure : MonoBehaviour
{
public static treasure instance;
public bool getkey;
[SerializeField]
private SpriteRenderer beforeRenderer;
[SerializeField]
private Sprite afterSprite;
private void Awake()
{
instance = this;
}
private void OnCollisionEnter2D(Collision2D other)
{
if (other.gameObject.CompareTag("Player"))
{
if (getkey == false)
{
beforeRenderer.sprite = afterSprite;
getkey = true;
}
}
}
}
と入力するッピ!


ちなみにこれは
using UnityEngine;
public class treasure : MonoBehaviour
{
public static treasure instance;
public bool getkey;
[SerializeField]
private SpriteRenderer beforeRenderer;
[SerializeField]
private Sprite afterSprite;
private void Awake() {
instance = this;
}
private void OnCollisionEnter2D(Collision2D other) {
if (other.gameObject.CompareTag(“Player“)) {
if (getkey == false) {
beforeRenderer.sprite = afterSprite;
getkey = true;
}}
}}
という意味になるッピ!

こういう意味だったのか!

勉強になるわ
//宝箱
using UnityEngine;
public class treasure : MonoBehaviour
{
public static treasure instance;// 外部呼び出し許可設定
public bool getkey;
[SerializeField]
private SpriteRenderer beforeRenderer;// 変更前の画像
[SerializeField]
private Sprite afterSprite;// 変更後の画像
private void Awake()
{
instance = this;// このオブジェクトに外部呼び出し許可を設定
}
private void OnCollisionEnter2D(Collision2D other)
{
if (other.gameObject.CompareTag("Player"))
{
if (getkey == false)// 鍵をまだ持ってなかったら
{
beforeRenderer.sprite = afterSprite;// 画像変更
getkey = true;// 鍵の取得
}
}
}
}
宝箱を開けたあとの画像を設定

宝箱の開けたあとの画像を設定するッピ!


まず
インスペクター→treasure(スクリプト)
を選ぶッピ!
BeforeRenderer にはヒエラルキーの宝箱
AfterSprite にはアセットの開けたあとの宝箱の画像
をドラッグ&ドロップするッピ~

オッケーできたぜ!

いい感じね!
扉のプログラムを設定

ここからは扉のプログラムを組むッピ!


宝箱を選んだまま
インスペクター→コンポーネントを追加→New script→【openDoor】と名前をつけるッピ!
そのままC#スクリプトをクリックしてスクリプトを編集するッピよ~

↓の文をコピーして
using UnityEngine;
public class openDoor : MonoBehaviour
{
private void OnCollisionEnter2D(Collision2D other)
{
if (other.gameObject.CompareTag("Player"))
{
if (treasure.instance.getkey == true)
{
gameObject.SetActive(false);
}
}
}
}
と入力するッピ!


ちなみにこれは
using UnityEngine;
public class openDoor : MonoBehaviour
{
private void OnCollisionEnter2D(Collision2D other){
if (other.gameObject.CompareTag(“Player“)) {
if (treasure.instance.getkey == true){
gameObject.SetActive(false);
}}
}}
という意味になるッピ!

こういう意味だったのか!

勉強になるわ
//ドア
using UnityEngine;
public class openDoor : MonoBehaviour
{
private void OnCollisionEnter2D(Collision2D other)// オブジェクトが質量のあるものに触れたら
{
if (other.gameObject.CompareTag("Player"))// 中でもプレイヤーに触れたら
{
if (treasure.instance.getkey == true)// 鍵を持っていたら
{
gameObject.SetActive(false);// 扉を削除
}
}
}
}
テストプレイ


おお!
宝箱が空いて扉が消えたぞ!

やったね♪
他のスプリクトから変数を呼び出す スタティック化とは?

今回スプリクトをスタティック化して
他のスプリクトでも使えるようにした
のがミソッピ!

スタティック化?

本来、
スプリクトのファイルとファイル同士は
バラバラでリンクしてないゆえ、
他のスプリクトの変数って読み込めない
んだッピ!

そうなのか!?

だから、今回は
public static treasure instance;// 外部呼び出し許可設定
private void Awake()
{
instance = this;// このオブジェクトに外部呼び出し許可を設定
}
で他のファイルでも使えるようインスタンス(実体化)して、
共同ファイル(スタティック化)にしたんだッピ!

????

なに言ってるかわかんねーよ
うさタブ

インスタンス化とかスタティック化とか
いきなり言われても・・・

カンタンに言うと
スプリクトのコードは料理のレシピ
んだッピ!

カンタンに言うと
レシピを使って実体のある料理をつくることを
インスタンス化
というんだッピ!

今回でいうと、
自家製のホワイトソースを作って作った料理を
他の料理に使えるようにする
グラタンやシチューを作ることを
スタティック化
というんだッピ!

作ったスタティックの変数は、今回なら
treasure.instance.getkey
といった感じで他スプリクトから呼び出すっピ!

わかったわ!

オレは料理しねーから
たとえがサッパリだぜ
その他の呼び出し方法

今回は宝箱のコードごとスタティック化したッピが、
スプリクトA(呼び出されるスプリクト)
using UnityEngine;
public class testA : MonoBehaviour
{
public static string testLog = "こんにちは";//文字のスタティック化
}
スプリクトB(呼び出すスプリクト)
using UnityEngine;
public class testB : MonoBehaviour
{
string testB = testA.testLog;//スタティック化した文字の呼び出し
void Start()
{
Debug.Log("testLog");
}
}
みたいに変数だけでもできるッピよ~

この場合は、
testA.testLog
といった感じで他スプリクトから呼び出すっピ!
学習のまとめ
扉のコード
//宝箱
using UnityEngine;
public class treasure : MonoBehaviour
{
public static treasure instance;// 外部呼び出し許可設定
public bool getkey;
[SerializeField]
private SpriteRenderer beforeRenderer;// 変更前の画像
[SerializeField]
private Sprite afterSprite;// 変更後の画像
private void Awake()
{
instance = this;// このオブジェクトに外部呼び出し許可を設定
}
private void OnCollisionEnter2D(Collision2D other)
{
if (other.gameObject.CompareTag("Player"))
{
if (getkey == false)// 鍵をまだ持ってなかったら
{
beforeRenderer.sprite = afterSprite;// 画像変更
getkey = true;// 鍵の取得
}
}
}
}
宝箱のコード
//ドア
using UnityEngine;
public class openDoor : MonoBehaviour
{
private void OnCollisionEnter2D(Collision2D other)// オブジェクトが質量のあるものに触れたら
{
if (other.gameObject.CompareTag("Player"))// 中でもプレイヤーに触れたら
{
if (treasure.instance.getkey == true)// 鍵を持っていたら
{
gameObject.SetActive(false);// 扉を削除
}
}
}
}
- 必要な画像を用意する
- 扉に当たり判定と質量を追加
- 宝箱に当たり判定と質量を追加
- プレイヤータグを追加
- スプリクトの作成
- スタティック化で他のスプリクトで読み込めるようにする
- 宝箱に画像変更のギミックを追加

上手くできたッピか?
これからも色んなゲーム作りやプログラムの解説をしていくッピ!
次回も楽しみにしているッピよ~~!

UnityはC#を元に作られているッピ!
まだまだ Unity や C#について勉強したい人は↓の記事を参考にするッピ♪