IT Learning

実践形式でITのお勉強

Unity

【Unity】キャラクターが近づいたら自動ドアが開閉するようにする

投稿日:2020年11月23日 更新日:

概要

Unityで建物などを作成した際、入り口にドアを置き、キャラクターが近づくと自動で開閉するようにしたいときがあります。今回はその一例について紹介します。

実現例

使用アセット

今回は自動ドアの開閉を試すためのAssetとして以下を使用させて頂きます。Freeなのに素敵なクオリティで、ドア開閉のアニメーションも付属されているので、使いやすいです。

https://assetstore.unity.com/packages/3d/environments/sci-fi/sci-fi-styled-modular-pack-82913

Step 1 : Doorオブジェクトの配置

上述のリンク先からアセットをダウンロードしてImportした後、Sci-Fi Styled Modular Pack > Prefabs > Decorative elements > Doorsからdoor_2をドラッグ&ドロップでsceneに配置します。

配置したdoor_2

Step2 : Colliderの設定

このドアオブジェクトに、キャラクターが近づいたら検知するためのColiderを設定します。今回はドア正面に入ったら反応するようにしたいので、Box Colliderを使用することにしました。

doorオブジェクトのInspectorからAdd ComponentsでBox Colliderをセットします。ここで、留意点として、Is Triggerにチェックを入れておきます。これはキャラクターが通り抜けた際に反応するようにするためです。チェックを入れておかないとキャラクターがColliderにぶつかり、ドアを通れなくなってしまいます。

SizeのZの値はドアが反応する距離に相当します。ここは好きな値で良いですが、今回は6にしておきました。

Box Colliderをセットした様子

Step3 : アニメーションとスクリプト

今回使用するdoor_2にはありがたいことにドアを開閉するAnimation ClipとAnimation Controllerがすでに内包されており、door_2のprefabオブジェクトに既にアタッチされています。[ door_2 ] の[ Inspector ]> [ Animator ]の[ frame_door_2 ] がそれになります。

そのため、あとはこのAnimation Controllerで定義されているcharacter_nearbyという変数のtrue/falseをスクリプトで制御するだけでドアが開閉できます。非常に便利です。

以下が、ドア開閉のスクリプトです。主な実現方法は以下になります。

  • OnTriggerEnterでキャラクタの接近を検知してドアを開ける
  • OnTriggerExitでキャラクタが離れたことを検知してドアを閉める
  • キャラクタにはPlayerタグをつけておき、Playter以外には反応しないようにする(これは要件次第なので任意)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DoorCon : MonoBehaviour
{
    Animator animator;
    // Start is called before the first frame update
    void Start()
    {
        //Animatorの取得
        animator = this.GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {

    }
    void OnTriggerEnter(Collider other)
    {
        //PlayterがColliderの範囲内に入ったら
        if(other.tag =="Player")
        {
            //character_nearbyをtrueにしてドアを開ける
            animator.SetBool("character_nearby", true);
        }
    }
    void OnTriggerExit(Collider other)
    {
        //PlayterがColliderの範囲から出たら
        if (other.tag == "Player")
        {
            //character_nearbyをtrueにしてドアを閉める
            animator.SetBool("character_nearby", false);
        }
    }

上記のスクリプトをdoor_2オブジェクトにアタッチすれば冒頭のあにメーションの動きになります。

以上です。

Unityを一から学ぶのにおすすめの本はコチラ

Related

-Unity

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です