Unityゲームシーン上でキャラクターオブジェクトを切り替えて表示/非表示にするスクリプト
オブジェクト自身のアクティブ、非アクティブ操作か、オブジェクトのメッシュレンダラーを操作をする。今回はこの2つのパターンをスクリプトにまとめておく。汎用性重視でシンプルに。いろんなことに応用できそう。(キー入力は適当)
環境 Win10 + Unity 2019.4.22f1 (64-bit)
前提
空オブジェクト(親)の子オブジェクトに切り替えをしたいキャラオブジェクトが複数存在する場合を考える。
1、キャラクターオブジェクト切り替えスクリプト
CharacterChg.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CharacterChg : MonoBehaviour {
private int index = 0;
private int o_max = 0;
GameObject [] childObject;
void Start()
{
o_max = this.transform.childCount;//子オブジェクトの個数取得
childObject = new GameObject[o_max];//インスタンス作成
for(int i = 0; i < o_max ; i++){
childObject[i] = transform.GetChild(i).gameObject;//すべての子オブジェクト取得
}
//すべての子オブジェクトを非アクティブ
foreach(GameObject gamObj in childObject){
gamObj.SetActive(false);
}
//最初はひとつだけアクティブ化しておく
childObject[index].SetActive(true);
}
void Update ()
{
if(Input.GetKeyDown("a")){
//現在のアクティブな子オブジェクトを非アクティブ
childObject[index].SetActive(false);
index++;
//子オブジェクトをすべて切り替えたらまた最初のオブジェクトに戻る
if(index == o_max){index = 0;}
//次のオブジェクトをアクティブ化
childObject[index].SetActive(true);
}
}
}
説明
キーボードaを押すと子オブジェクトのActive、非Activeが切り替わり
順々にキャラオブジェクトが切り替わっていく。
2,キャラの描画だけ無効にするスクリプト
RendererCon.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RendererCon : MonoBehaviour
{
private Renderer[] rend;
private bool flg = false;
void Update()
{
if(Input.GetKeyDown("b")){
rend = GetComponentsInChildren<Renderer>();//すべての子オブジェクトのレンダラー取得
foreach (Renderer r in rend){
r.enabled = flg;
}
flg = !flg;
}
}
}
説明
キーボードのbを押すとキャラクタの表示/非表示を切り替える(※表示のみ。他のコンポーネントは生きている)。
大抵キャラのオブジェクト(プレハブ)は体のパーツ毎にRendererが複数ある。そのためオブジェクトがもつRendererコンポーネントをすべて取得して丸ごとDisableにする。(すべてのパーツのRendererをDisableにしないと生首だけが描画されたり、身体だけ描画されたりとかいう事態になる。)
以上のスクリプトは”SDこはくちゃんズ・小碓学園夏&冬制服モデルアセット” ↓を使用して動作確認した。
前回の記事
のスクリプトと組み合わせると、
↓こんな感じでキャラオブジェクトをお手軽に観察することができる。
参考
子オブジェクトの取得
https://docs.unity3d.com/ja/current/ScriptReference/GameObject.GetComponentsInChildren.html
子オブジェクトカウントhttps://docs.unity3d.com/ja/2018.4/ScriptReference/Transform-childCount.html