Instantly share code, notes, and snippets.

Embed
What would you like to do?
カメラと対象との間の遮蔽物を一時的に非表示にします。Unity 用。
/// License
///
/// NYSL Version 0.9982
///
/// A. 本ソフトウェアは Everyone'sWare です。このソフトを手にした一人一人が、
/// ご自分の作ったものを扱うのと同じように、自由に利用することが出来ます。
///
/// A-1. フリーウェアです。作者からは使用料等を要求しません。
/// A-2. 有料無料や媒体の如何を問わず、自由に転載・再配布できます。
/// A-3. いかなる種類の 改変・他プログラムでの利用 を行っても構いません。
/// A-4. 変更したものや部分的に使用したものは、あなたのものになります。
/// 公開する場合は、あなたの名前の下で行って下さい。
///
/// B. このソフトを利用することによって生じた損害等について、作者は
/// 責任を負わないものとします。各自の責任においてご利用下さい。
///
/// C. 著作者人格権は SakuraCrowd に帰属します。著作権は放棄します。
///
/// D. 以上の3項は、ソース・実行バイナリの双方に適用されます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq; // Except
/// <summary>
/// カメラと対象との間の遮蔽物(Cover)を透明化します。
/// カメラに付加してください。
/// 透明にする遮蔽物は Renderer コンポーネントを付加している必要があります。
/// </summary>
public class SCCameraCoverTransparent : MonoBehaviour {
/// <summary>
/// 被写体を指定してください。
/// </summary>
[SerializeField]
private Transform subject_;
/// <summary>
/// 遮蔽物のレイヤー名のリスト。
/// </summary>
[SerializeField]
private List<string> coverLayerNameList_;
/// <summary>
/// 遮蔽物とするレイヤーマスク。
/// </summary>
private int layerMask_;
/// <summary>
/// 今回の Update で検出された遮蔽物の Renderer コンポーネント。
/// </summary>
public List<Renderer> rendererHitsList_ = new List<Renderer>();
/// <summary>
/// 前回の Update で検出された遮蔽物の Renderer コンポーネント。
/// 今回の Update で該当しない場合は、遮蔽物ではなくなったので Renderer コンポーネントを有効にする。
/// </summary>
public Renderer[] rendererHitsPrevs_;
// Use this for initialization
void Start () {
// 遮蔽物のレイヤーマスクを、レイヤー名のリストから合成する。
layerMask_ = 0;
foreach(string _layerName in coverLayerNameList_)
{
layerMask_ |= 1 << LayerMask.NameToLayer(_layerName);
}
}
// Update is called once per frame
void Update () {
// カメラと被写体を結ぶ ray を作成
Vector3 _differnce = (subject_.transform.position - this.transform.position);
Vector3 _direction = _differnce.normalized;
Ray _ray = new Ray(this.transform.position, _direction);
// 前回の結果を退避してから、Raycast して今回の遮蔽物のリストを取得する
RaycastHit[] _hits = Physics.RaycastAll(_ray, _differnce.magnitude, layerMask_);
rendererHitsPrevs_ = rendererHitsList_.ToArray();
rendererHitsList_.Clear();
// 遮蔽物は一時的にすべて描画機能を無効にする。
foreach (RaycastHit _hit in _hits)
{
// 遮蔽物が被写体の場合は例外とする
if (_hit.collider.gameObject == subject_)
{
continue;
}
// 遮蔽物の Renderer コンポーネントを無効にする
Renderer _renderer = _hit.collider.gameObject.GetComponent<Renderer>();
if (_renderer != null)
{
rendererHitsList_.Add(_renderer);
_renderer.enabled = false;
}
}
// 前回まで対象で、今回対象でなくなったものは、表示を元に戻す。
foreach (Renderer _renderer in rendererHitsPrevs_.Except<Renderer>(rendererHitsList_))
{
// 遮蔽物でなくなった Renderer コンポーネントを有効にする
if (_renderer != null)
{
_renderer.enabled = true;
}
}
}
}
@sakura-crowd

This comment has been minimized.

Show comment
Hide comment
@sakura-crowd

sakura-crowd May 13, 2018

このスクリプトに関する説明を Qiita で記述しました。
Unity でカメラと被写体の間の遮蔽物を非表示にするスクリプトを作ってみた - Qiita : https://qiita.com/sakura-crowd/items/3608b2fd6df8a953240a

Owner

sakura-crowd commented May 13, 2018

このスクリプトに関する説明を Qiita で記述しました。
Unity でカメラと被写体の間の遮蔽物を非表示にするスクリプトを作ってみた - Qiita : https://qiita.com/sakura-crowd/items/3608b2fd6df8a953240a

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment