うにty生活

UnityChanを生活させたい

Fortniteのインタラクト真似してみた #16

 

どうもラブヘイトです

今回から#ごめんねEpicGames シリーズ始めていきます!

決して煽っているわけではなく...(汗)

Fortnite大好き人間だからこそUnityでも再現したいなと思い至っただけです

 

私のパソコンではUE4は重くて重くて...

 

 

はじめに

インタラクトの英語としての意味は「相互に作用する」らしいです

こっちがアクションを起こしたら、オブジェクトも動き出すって感じでしょうか笑

◆作りたいもの

というわけで今回作っていくのは人気バトロワゲーム、「Fortnite」の

一部分を真似していきます

 

見ていただいた方が早いのでこちら↓

f:id:tubakihimeLoveHate:20181208091805g:plain



今回作っていくのは

宝箱や扉に近づいた時に出てくる「開ける」と表示する機能です

 

◆UIを作成する

真似しようという企画なので、とことん似せていきます

3Dの中にUIがあるみたいに見えるので、今回はオブジェクトとして扱えるWorld SapceのCanvas利用していきます

(Canvasいちいちでかくなるのめんどくs...)

canvasについては過去の記事を参考にしてください

 

tubakihimelovehate.hatenablog.com

 

 

f:id:tubakihimeLoveHate:20181209212846p:plain



またまた登場タンスの横幅半分くらいのサイズにしたら、タンスくん(なんでもいい)の子にします

 

◆コード

新しいスクリプトを作成します

もともとタンスには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);
    }

 

f:id:tubakihimeLoveHate:20181209214410g:plain



これでどのカメラ位置からUnitychanが当たっても

必ずカメラを向くUIが完成しました

 

◆問題点

これだとタンスとUnityちゃんの距離が0距離にならないと出てこない、、

普通タンスは離れて開けますよね

 

タンスとしての当たり判定も欲しいし、離れた場所からもあたり判定欲しいと思ったので2つBoxColliderをつけてみました!(丸いコライダーでもいいかも)

そのうち一つは範囲を広げてisTriggerにチェックをつけてコードを付け足します

f:id:tubakihimeLoveHate:20181209214713p:plain



最終的にできたコードはこちら

 

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つつけていいものかどうかは知らん)

 

てな感じで離れた少し離れた場所からインタラクトできるようになってよかった!

f:id:tubakihimeLoveHate:20181209215437g:plain

 

もしオブジェクトがたくさん配置されている場合はtagとかで制御すればいいと思います

 

Fortnite好きなのでまたこのシリーズしますw

ではまた