前回でOnTriggerに関する不具合が直ったのでアイテムを拾う処理を実装します。
とはいえ前回までで大体が実装できているのでやることは少ないです。
設計
現状だと以下のことしかできません。
- アイテムを拾える位置まで近づいたら検知
- アイテムを拾えない位置まで離れたら検知
検知した後の処理が無いので考えます。
アイテムを拾える位置まで近づいた場合
この場合は2通りに場合分けします。
- Aボタンを押した → アイテムを拾う
- Aボタンを押してない → 何もしない
アイテムを拾えない位置まで離れた場合
この場合は何もしません。
それ以外の処理も必要ありません。
実装
以下のプログラムを使用しました。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
/* 周囲にアイテムがあるか判定するクラス */
public class SearchItem : MonoBehaviour {
// UnityChan!のスクリプト「IsDestroy.cs」を参照
public GameObject UnityChan;
// アイテムを拾える位置まで近づいたときに起動
void OnTriggerEnter(Collider col)
{
// 離れたオブジェクトのタグが"Item"のとき
if(col.tag == "Item")
{
UnityChan.GetComponent<IsDestroy>().SetItem(col.gameObject.transform.parent.gameObject);
UnityChan.GetComponent<IsDestroy>().ChangeFlag(1);
}
}
// アイテムを拾えない位置まで離れたときに起動
void OnTriggerExit(Collider col)
{
// 離れたオブジェクトのタグが"Item"のとき
if(col.tag == "Item")
UnityChan.GetComponent<IsDestroy>().ChangeFlag(0);
}
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
/* アイテムを破壊するクラス */
public class IsDestroy : MonoBehaviour {
// メインカメラのスクリプト「ItemManager.cs」を参照
public GameObject MainCamera;
// アイテムプレハブ
public GameObject Prefab;
// アイテムを拾う判定
public int flag = 0;
// 破壊対象のアイテム名
private string i_name;
void Update()
{
ItemDestroy();
}
// アイテムを拾ったか判定
public void ItemDestroy()
{
// 「a」が押された場合
if(Input.GetKeyDown ("a"))
{
// OnTriggerEnter が起動している場合
if(flag == 1)
{
MainCamera.GetComponent<ItemManager>().ItemPick(i_name);
Destroy(Prefab);
ChangeFlag(0);
}
}
}
// 破壊対象のアイテムを設定
public void SetItem(GameObject obj)
{
Prefab = obj;
i_name = obj.name;
i_name = i_name.Substring(0, i_name.IndexOf('('));
}
// アクション「アイテムを拾う」が有効か判定
public void ChangeFlag(int _flag)
{
// OnTriggerEnter なら 1, OnTriggerExit なら 0 を設定
flag = _flag;
}
}

動作確認
仕様どおりに動作しました。
アイテム関連の開発が終了したので、Unity日記はこれで終わりにしようと思います。
全体を通して、Webアプリ開発とは全然違ったから割と難しかったですが、C#に慣れることができたのは結構よかったです。