本記事は、3Dオブジェクトのフェードイン・フェードアウトをさせるスクリプトの実践編です。
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使いたいけれど、日本語で学習したい方へ↓
