どうもラブヘイトです
今回から#ごめんねEpicGames シリーズ始めていきます!
決して煽っているわけではなく...(汗)
Fortnite大好き人間だからこそUnityでも再現したいなと思い至っただけです
私のパソコンではUE4は重くて重くて...
はじめに
インタラクトの英語としての意味は「相互に作用する」らしいです
こっちがアクションを起こしたら、オブジェクトも動き出すって感じでしょうか笑
◆作りたいもの
というわけで今回作っていくのは人気バトロワゲーム、「Fortnite」の
一部分を真似していきます
見ていただいた方が早いのでこちら↓
今回作っていくのは
宝箱や扉に近づいた時に出てくる「開ける」と表示する機能です
◆UIを作成する
真似しようという企画なので、とことん似せていきます
3Dの中にUIがあるみたいに見えるので、今回はオブジェクトとして扱えるWorld SapceのCanvas利用していきます
(Canvasいちいちでかくなるのめんどくs...)
canvasについては過去の記事を参考にしてください
tubakihimelovehate.hatenablog.com
またまた登場タンスの横幅半分くらいのサイズにしたら、タンスくん(なんでもいい)の子にします
◆コード
新しいスクリプトを作成します
もともとタンスにはBox ColliderがついているのでOnCollitionStayメソッドを使います
こんな感じ↓
//UIをセット
public GameObject open;
void OnCollisionStay(Collision other)
{
open.SetActive(true);
}
void OnCollisionExit(Collision other)
{
open.SetActive(false);
}
さらにUIはキャラクターに関係なく、いつでもカメラを向いてほしいので
2行追加します
//カメラをセット
public GameObject camera;
void OnCollisionStay(Collision other)
{
open.SetActive(true);
open.transform.LookAt(camera.transform);
}
これでどのカメラ位置からUnitychanが当たっても
必ずカメラを向くUIが完成しました
◆問題点
これだとタンスとUnityちゃんの距離が0距離にならないと出てこない、、
普通タンスは離れて開けますよね
タンスとしての当たり判定も欲しいし、離れた場所からもあたり判定欲しいと思ったので2つBoxColliderをつけてみました!(丸いコライダーでもいいかも)
そのうち一つは範囲を広げてisTriggerにチェックをつけてコードを付け足します
最終的にできたコードはこちら
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class tumbaTouch : MonoBehaviour {
//UIをセット
public GameObject open;
//カメラをセット
public GameObject camera;
//インタラクトUIの長押しに反応するゲージ
//Findは使わない主義なので定義します
public Image gage;
//タンスが開いているか判定
bool getOpen = false;
Vector3 offset = new Vector3(0,0,14f);
// Use this for initialization
void Start () {
}
// Update is called once per frame
void FixedUpdate () {
if(open.activeSelf && Input.GetKey(KeyCode.P)){
gage.fillAmount += Time.fixedDeltaTime;
}else{
gage.fillAmount = 0;
}
if(gage.fillAmount == 1){
//開いているかどうかの判定
if(getOpen)
transform.localPosition -= offset;//閉める処理
else
transform.localPosition +=offset;//開ける処理
getOpen = !getOpen;
gage.fillAmount = 0;
}
}
/*
void OnCollisionStay(Collision other)
{
open.SetActive(true);
open.transform.LookAt(camera.transform);
}
void OnCollisionExit(Collision other)
{
open.SetActive(false);
}
*/
void OnTriggerStay(Collider other)
{
open.SetActive(true);
open.transform.LookAt(camera.transform);
}
void OnTriggerExit(Collider other)
{
open.SetActive(false);
}
}
2つもColliderあっていけるのかなあと疑問でしたが、コードもしっかりどちらとも反応してくれるみたいです(2つつけていいものかどうかは知らん)
てな感じで離れた少し離れた場所からインタラクトできるようになってよかった!
もしオブジェクトがたくさん配置されている場合はtagとかで制御すればいいと思います
Fortnite好きなのでまたこのシリーズしますw
ではまた