Unity

【Unity】当たり判定で3Dオブジェクトをフェイドアウトさせる方法【当たり判定OnTriggerとboolを学ぶ】

本記事内には、アフィリエイトリンクを含む場合があります

本記事は、3Dオブジェクトのフェードイン・フェードアウトをさせるスクリプトの実践編です。

3Dオブジェクトのフェードイン・フェードアウト(方法)↓

【Unity】メッシュモデルや3Dオブジェクトをフェードイン・フェードアウトさせる方法【スクリプトで徐々に消す】Unityを使ってゲームや映像を作っていると、 3Dオブジェクトに、徐々に消えるエフェクトをつけたいと思ったことはないですか? ...

前回は、フェードイン・フェードアウトを、2つのbool(trueまたはfalse)を設け、それをInspector上でクリックすることで、制御しました。

しかし、実際のゲームでは、Inspectorをいじることはできません。

なので、ゲーム内のアクションで、これらのboolを変えられるようにすれば、

フェードイン・フェードアウトを起こすことができるようになります。

 

やり方は無限にあると思いますが、

アイテムを取るとそれがフェードアウトすることを想定して、

オブジェクトに”Player”が衝突して消える(フェードアウトする)ようにしたいと思います。

完成イメージ↓

1.Sphereとプレイヤーを配置

Sphereは前回と同じ状態です。

そこにプレイヤーを配置します。

本ブログマスコットキャラクターの”システマン”を置いてますが、中身はunity-chanです。

unity-chanのプレハブは配置するだけで、動くようになるのでとても便利ですね!

オリジナルキャラクターをunity-chanのように動かす方法は、こちら↓

なお、プレイヤーオブジェクトのTagはPlayerにしておきます(後に活躍する)。

この段階では、Sphereはただの球体で、乗れます。

Inspectorのbool(IsFadeOutやIsFadeIn)にチェックで、描画のみを制御できます。

2.Sphereのスクリプトに追記する

Sphereにアタッチされている、SphereFader.csに追記を行います。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SphereFader : MonoBehaviour
{
    float fadeSpeed = 0.01f;        // 透明度が変わるスピード
    float red, green, blue, alfa;   // Materialの色
 
    public bool isFadeOut = false;  // フェードアウト処理の開始、完了を管理
    public bool isFadeIn = false;   // フェードイン処理の開始、完了を管理
 
    Renderer fadeMaterial;          // Materialにアクセスする容器
    
    // Start is called before the first frame update
    void Start()
    {
        fadeMaterial = GetComponent<Renderer>();
        red = fadeMaterial.material.color.r;
        green = fadeMaterial.material.color.g;
        blue = fadeMaterial.material.color.b;
        alfa = fadeMaterial.material.color.a;
    }
    // Update is called once per frame
    void Update()
    {
        if(isFadeIn){
            StartFadeIn (); // boolにチェックが入っていたら実行
        }
        if (isFadeOut) {
            StartFadeOut (); //boolにチェックが入っていたら実行     
        }
    }
    void StartFadeOut()
    {
        alfa -= fadeSpeed;         // 不透明度を下げる
        SetAlpha ();               // 変更した透明度を反映する
        if(alfa <= 0)              // 完全に透明になったら処理を抜ける
        {             
            isFadeOut = false;     // boolのチェックが外れる
            fadeMaterial.enabled = false;  // Materialの描画をオフにする
        }
    }
    void StartFadeIn(){
        fadeMaterial.enabled = true;  // Materialの描画をオンにする
        alfa += fadeSpeed;          // 不透明度を徐々に上げる
        SetAlpha ();                // 変更した不透明度を反映する
        if(alfa >= 1)               // 完全に不透明になったら処理を抜ける
        {                    
            isFadeIn = false;       // boolのチェックが外れる
        }
    }

    void OnTriggerEnter(Collider other)
    {
        if(other.gameObject.tag == "Player") // 衝突したのがPlayerの場合
        {
            if(fadeMaterial.enabled)   // Materialの描画がオンなら
            {
                isFadeOut = true;      // FadeOutのboolにチェック
            }
            else                       // Materialsの描画がオフなら
            {
                isFadeIn = true;       // FadeInのboolにチェック
            }
        }
    }

    void SetAlpha()
    {
        fadeMaterial.material.color = new Color(red, green, blue, alfa);
         // 変更した不透明度を含むMaterialのカラーを反映する
    }
}

追記したのは、 void OnTriggerEnter(Collider other) のメソッド部分だけです^^;

このオブジェクトが当たり判定を受けたとき、
プレイヤータグの当たったオブジェクトがPlayerタグのものだった場合に、
それぞれのboolのチェックが入るようにしました。

せっかくbool IsFadeInもあるので、
描画されていないときに当たれば、フェードインするようにしています。

 

また、衝突判定をもつようにするために、
SphereオブジェクトのSphere ColliderのIs Triggerにチェックを入れます。

その代わり、このオブジェクトはすり抜けられるようになります。

すり抜けさせたくない場合、別途Sphere Colliderをつければよいでしょう。

という具合で、フェードアウトであろうと、使い方は簡単ですね。

boolで状態をコントロールすると、連続的な当たり判定を避けることができます。

 

以上、ご参考まで^^

unity使いたいけれど、日本語で学習したい方へ↓

Unityのチュートリアルやエディターを日本語化する方法【英語に抵抗があっても大丈夫】Unityは、世界屈指のゲーム開発エンジンです。 ゲーム業界にとどまらず、XR技術によって、さまざまな事業を牽引する存在となるでし...
ABOUT ME
いなも@システマライフハッカー
”仙豆”を開発することを夢見て、健康食品会社で働いていたものの、2016年に出会ったロシアの武術”システマ”こそ、その糸口があると感銘し、勝手にシステマ普及活動を始める。 一方で、クリエイティブなモノ作りが好きで、DX社会で楽しみを見出せる"Unity”を活かして、”スマートかつ快適な暮らし”のヒントを発信している。

COMMENT

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

CAPTCHA