今回は【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;
}}
}}
という意味になるッピ!
こういう意味だったのか!
勉強になるわ
宝箱を開けたあとの画像を設定
宝箱の開けたあとの画像を設定するッピ!
まず
インスペクター→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);
}}
}}
という意味になるッピ!
こういう意味だったのか!
勉強になるわ
テストプレイ
おお!
宝箱が空いて扉が消えたぞ!
やったね♪
他のスプリクトから変数を呼び出す スタティック化とは?
今回スプリクトをスタティック化して
他のスプリクトでも使えるようにした
のがミソッピ!
スタティック化?
本来、
スプリクトのファイルとファイル同士は
バラバラでリンクしてないゆえ、
他のスプリクトの変数って読み込めない
んだッピ!
そうなのか!?
だから、今回は
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#について勉強したい人は↓の記事を参考にするッピ♪