限定公開から全体公開に移行しました。
この記事は、2019年に作成したものです。
今回は、迷路などで最初は通ることができない道を鍵取得などの特定条件を満たしたときに通れるようになる処理を作成していきます。
この記事で学べること
- Unityでbool(真偽)を扱うことができるようになる。
- 特定のタイミングでGameObjectを消すことができるようになる。
- タグの使い方を知ることができる。
#1.まずはカギと扉を作ろう!
まずは自由に鍵を作ります!(別のツールやassetを使ってもOK!)
自分はUnity内でSphereとCapsuleを組み合わせてこんな感じの鍵をつくりました!
次にできた鍵を一つの階層にまとめる。
次に以下の写真の手順で**Key
という名前のtagを作成してカギの一番上の階層**につけましょう。
<手順1>
<手順2>
<手順3>
同じように「扉」を作成しましょう。
さばとは簡単にこんな感じの扉を作成しました。
カギと同じように扉にもdoor
という名前のtag
を付ける。
カギと扉を作成出来たら次はプログラムを考えて行きましょう。
#2.キャラクターがカギに触れたときのプログラムを書く。
まずどのようにプログラムを作成していくか考えます。
まだ作成したことがなければ以下のように考えると思います。
作成時の疑問点
1. 鍵を取得した状態をどのように反映させるか。
2. 取得した状態でどうすれば壁を消し通ることができるのか。
まず疑問1から考えましょう!
疑問1(鍵を取得した状態をどのように反映させるか)
作成方法はたくさんがあるが、今回は鍵が一つしか出てこないことを想定して変数に**「取得している」か「取得していない」**の状態を保存することで作成していきます。
二択の状態を保存するのに適している変数の型にbool
というものがあるので今回はbool
を使用して作成していきます。(intで0,1で置き換えてもOK!)
bool
とは**true(真)またはfalse(偽)**のどちらかを入れることができる型でプログラムではよく使うので覚えておいてください。
ではまず、PlayerにGetKeyState.cs
というC#スクリプトを作成してください。
作成したらbool型の変数を作成し名前はisGetKey
とし初期値はfalseとします。
今回はStart関数とUpdate関数は使用しないので消してしまってもOKです!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GetKeyState : MonoBehaviour
{
private bool isGetKey = false; //★この行を追加
void Start()
{
// ~~~~~~省略~~~~~~
これで保存するための変数の作成できました。
次に触れたときにカギを取得し、isGetKey
をtrue
にするプログラムを作成していきます。
update関数の下に新しくOnCollisionEnter
と呼ばれる触れた時のプログラムを追加します。
さらにif文で触れたGameObjectのタグがKey
ならという処理を入れてあげ、そのif文の中でisGetKey
をtrueにしましょう!
// ~~~~~~~省略~~~~~~~~
void Update()
{
}
//何かに触れたとき
private void OnCollisionEnter(Collision other)
{
//もし触れたオブジェクトのタグが"Key"なら
if (other.gameObject.CompareTag("key"))
{
//isGetKeyをTrue(真)にする。
isGetKey = true;
}
}
}
このように書くとobjectに触れたときisGetKeyがtrueになるプログラムが作成できました!
しかしこのままでは触れれば内部的にはisGetKey
がtrue
になるのですが、見た目は何も変わっていないのでisGetKeyをtrueにした後にはちゃんとカギを消してあげましょう
//~~~~省略~~~~~
private void OnCollisionEnter(Collision other)
{
if (other.gameObject.CompareTag("key"))
{
isGetKey = true;
//keyのobjectを削除する
Destroy(other.gameObject);
}
}
Destroy(gameobject) : ( )内のgameObjectを削除する。
これで疑問1は解決!
疑問2(取得した状態でどうすれば壁を消し通ることができるのか)
次に疑問2なのですが、ここまでやってきた人ならもうわかってきたと思います。
先ほど作成したOnCollisonEnterの中にもう一つ、扉用のif文を作成しその中でgameObjectを削除してあげましょう!
//~~~省略~~~~
private void OnCollisionEnter(Collision other)
{
if (other.gameObject.CompareTag("key"))
{
isGetKey = true;
Destroy(other.gameObject);
}
//もし触れたobjectのtagがdoorなら
if (other.gameObject.CompareTag("door")&&isGetKey)
{
Destroy(other.gameObject);
}
}
これで完成です!お疲れさまでした!!
バグ解決のヒント
<触れても消えない場合>
- tagはちゃんとついているか。
- プログラムで書いたtag名とunity側で入力したtag名が一緒か。(大文字小文字気を付けて!)
- objectにCollider当たり判定がついているか。または適切な位置にあるか。
まとめ
「鍵を入手して扉を開けよう!」はいかがだったでしょうか。タグを使う判定は様々なところで使えるのでしっかり学んでおきましょう!
もしわからないこと質問したいことがあればさばと
に気軽に質問してください。
ではでは。