ゴマちゃんフロンティア

気まぐれと勢いで作るUnityゲーム開発日記です

【再編集】Unity開発メモまとめ 「オブジェクトの透明処理」

time 2015/09/25

※本記事は旧ブログの記事を再編集し、再度投稿したものです。
 一部内容に差異がある可能性がありますので、予めご了承ください。

オブジェクトのフェードアウト

iTween.FadeTo()を使うことで、透明度と掛ける時間を設定してフェードさせることができます。
「lifeが0になったら透明にする」という処理を行う場合、該当キャラクターのUpdate()内に以下のように記述します。

protected void Update() {
   if(life <= 0){
      iTween.FadeTo(gameObject, iTween.Hash(
         "alpha", 0, 
           "time", 0.5f,
       "oncomplete", "Destroy",
       "oncompletetarget", gameObject
         ));
   }
}

private void Destroy() {
    Destroy(gameObject);
}

「oncomplete」と「oncompletetarget」を指定しておくと、iTween後に関数を実行させることができます。
上の例ではDestroy()を呼び出し削除処理をしています。

シェーダー修正

レンダラーモードをTransparentにすると描画順がおかしくなるので、シェーダーを修正します。
公式からビルドインシェーダーをダウンロードできるので、これをカスタマイズします。
http://japan.unity3d.com/unity/download/archive

各Pass内のZWriteの部分をすべてOnに書き替えましょう。
被らないようにソース冒頭のシェーダー名を「Standard_Custom」等に変えておきます。

両面シェーダー

せっかくなので両面シェーダーのメモも載せておきます。
ソース内に2箇所あるSubShaderのLODの下に「Cull off」を追加します。

・49~53行目付近
SubShader
{
Tags { “RenderType”=”Opaque” “PerformanceChecks”=”False” }
LOD 300
Cull off //この行

・208~212行目付近
SubShader
{
Tags { “RenderType”=”Opaque” “PerformanceChecks”=”False” }
LOD 150
Cull off //この行

カメラとプレイヤー間のオブジェクトの半透明化

カメラとプレイヤーの間に障害物が入ってしまい、プレイヤーを見失うことはよくあることです。
そんな時に障害物を半透明化し、プレイヤーが見えるようにします。

void Update () {
     float distance = Vector3.Distance(mainCamera.transform.position, player.transform.position);
     Ray ray = new Ray(mainCamera.transform.position, mainCamera.transform.forward * distance);
 
     if (Physics.Raycast(ray)) {
          RaycastHit[] hits = Physics.RaycastAll(ray);
 
          for (int i = 0; i < hits.Length; i++) {
               if (hits[i].collider.tag == "BreakObjects") {
                   iTween.FadeTo(hits[i].collider.gameObject, iTween.Hash(
                      "alpha", 0,
                      "time", 0.5f,
                      "oncomplete", "AlphaReset",
                      "oncompletetarget", hits[i].collider.gameObject
                   )); 
               }
          }
     }
}

予めオブジェクトにタグを付けておきます。
ここでは破壊可能なオブジェクトを指定し、if文でタグを評価します。

まず飛ばすRayのインスタンスを生成します。
上記の通りカメラ向きに飛ばせばいいので、[カメラの位置],[カメラの向き]を引数にセットします。
Rayを飛ばす距離は適当でも問題なさそうですが、一応カメラとプレイヤー間の距離を測り、それをforwardに掛けています。

生成したRayをRaycastで飛ばし、カメラとプレイヤーの間にオブジェクトが存在するか判定します。
存在する場合はRaycastAllで間のオブジェクトを全て取得し、特定のタグを持つオブジェクトのみを半透明化します。

「プレイヤーが隠れているか判定」のスクリプトでRay上のオブジェクトの配列を取得しています。
Raycast型なので、.collider.gameObjectでゲームオブジェクトを呼び出し、iTweenを実行します。

そのままでは半透明になりっぱなしなので、オブジェクトにスクリプトを付与します。
iTweenのoncompleteで透明度をリセットする関数を呼び出します。

using UnityEngine;
using System.Collections;
 
public class StageObject : MonoBehaviour {
 
     protected void AlphaReset() {
          iTween.FadeTo(gameObject, iTween.Hash(
               "alpha", 1f,
               "time", 0.5f
               ));
     }
}

スポンサーリンク

down

コメントする



PHP

Twitter

イラスト

日記

未分類

ツイッター