※本記事は旧ブログの記事を再編集し、再度投稿したものです。
一部内容に差異がある可能性がありますので、予めご了承ください。
オブジェクトのフェードアウト
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 )); } }