ステルス - 基本的な構造やシーン01の基本的なロジック

著作権:

  • 次のWebサイトで始まるこの記事オリジナル:
  1. ブログパーク「優れた夢のメイカーズムーブメント」空間にします。https://www.cnblogs.com/raymondking123
  2. 優秀な夢メイカーズムーブメント公式ブログます。https://91make.top
  3. 優れたゲーム夢のメーカー文化講演します。https://91make.ke.qq.com
  4. マイクロチャンネル公衆数の「優秀な夢メイカーズムーブメント」:umaketop
  • あなたは転載は自由ですが、完全な著作権表示を含める必要があります

シーンを設定します。

  • シーンのレイアウトは、設定の静的プロパティは、設けられた層の層は、属性を調整(Carmera、ライティング)

  • 一般的なレンダリング複雑なシーンのために、我々は(多くの三角形がある)非常に細かい行いますが、そのような内部の衝突検出イベントは、単純なポイントになることができ、シーンは、低モジュラスメッシュコライダーメッシュ//パフォーマンスのオーバーヘッドを削減、クラッシュを特徴付けています凸のオプションは、モデルが凸多角形は、(一般的に私たちが作成したポリゴンを凹かもしれないもの洞窟ああのように、凸多角形される)であることを示しています
  • シーンは//ナビゲーション遮光がオブジェクトのライトマップベーキング団結を参加//静的で静的に設定されている静的オブジェクトが必要です
  • 焼成後のテクスチャの内容は、物体に取り付けられたとして、シーン上でベークする光を増加させます
  • 光の効果を設定します。


光を追加します。

  • ベーキングは、生成されたオブジェクトの光に完成する予定の後に焼きにライト財産のベーキング、ベーキングオブジェクトは静的に必要な、照明 - >シーンでできる事前計算リアルタイムGI(リアルタイム照明が事前に計算削除)//:ベーキング照明地図情報を静的に設定されているオブジェクトに貼り付け(ファイルは、フォルダのシーンと同じ名前を持ちます)
  • 光は、この場合のシャドウ半径が影からバックスキャッタ方式の光の輝きの半径を決定し、その値が0である、全く散乱を意味しており、およびソフトシャドーハードシャドウ差がないバックアップされ、より大きな値、ソフトシャドー影より深刻な散乱
  • リアルタイムオプションは焼きGIのオフは、そのような反射の数が影響を受けるようなパラメータの形式、および照明 - >シーンで事前に計算リアルタイムGIを開く必要があり、光の柔らかな影の下で選択されています
  • 光影とリアルタイム計算のprecomputerのティータイムを使用してオブジェクトが移動し、//聞いたとき、オブジェクトが移動していないリアルタイムシステム及び焼き二つの機能を含む混合光照射パターンは、光が、使用焼成照明情報を変更していませんくらいですか?オブジェクトは、静的オブジェクトが動的オブジェクトに貼付され、ダイナミック、動かないので、影が基本的に固定され、優れたシャドウマップを焼くので、動的オブジェクトをシャドウするために、静的な視点を達成するのですか?
  • オブジェクトタグタイプの照明効果で発現光カリングマスクは、光影響からタグを選択しません

  • 警告ランプや効果音は、プレイヤーの後に、視覚的アラームを見つけたとき警報ランプが点灯し、シーンを増やす、シーンのライトは、ケアのシナリオを提供します。

  • 光スクリプト警告:
public class AlarmLight : MonoBehaviour
{
    public float fadeSpeed = 2f;  //灯光报警fade的速度(默认2s变化一次)
    public float hightIntensity = 4f; //最高最低亮度
    public float lowIntensity = 0.5f;
    public float changeMargin = 0.2f; //插值阈值
    public bool alarmOn;

    private float targetIntensity; //目标亮度值
    private Light alarmLight;
    private AudioSource audioSource;

    private void Awake()
    {
        alarmLight = GetComponent<Light>();
        audioSource = GetComponent<AudioSource>();
        alarmLight.intensity = 0;
        targetIntensity = hightIntensity;
    }

    // Update is called once per frame
    void Update()
    {
        if (alarmOn)
        {
            if (!audioSource.isPlaying)
                audioSource.Play();

            alarmLight.intensity = Mathf.Lerp(alarmLight.intensity, targetIntensity, fadeSpeed * Time.deltaTime);

            if (Mathf.Abs(targetIntensity - alarmLight.intensity) < changeMargin)
            {
                if (targetIntensity == hightIntensity)
                    targetIntensity = lowIntensity;
                else
                    targetIntensity = hightIntensity;
            }
        }
        else
        {
            if (audioSource.isPlaying)
                audioSource.Stop();

            alarmLight.intensity = Mathf.Lerp(alarmLight.intensity, 0, fadeSpeed * Time.deltaTime);
        }
    }
}

シーンライトマップをベーキング

  • //焼く焼成シーン焼成シーン照明のタイプを使用して、照明効果を発現するための物体の表面に付着さマップを生成します

  • ユニティの公式な説明:
  • 意味を焼成:リアルタイムユニティに単一の光源を使用する場合、これらの光線は自動的に反映されません。グローバルイルミネーション技術を使用して、よりリアルなシーンを作成するために、我々は事前に計算された照明ソリューションのユニティを有効にする必要があり、Unityは(GIと呼ばれるグローバルイルミネーション()のと呼ばれる技術を使用して)複雑な静的な照明効果を計算して言ったでそれらを保存することができます参照によるテクスチャマップライトマップ。この計算プロセスはベーキングと呼ばれています。ライトマップを焼成すると、シーンのジオメトリのカバーのテクスチャは照明効果を作成するには、シーン内の静的オブジェクトへの光の影響を計算し、テクスチャに結果を書き込みます。

  • (これらは、表面に照射ライトマップの直接光の両方を含むことができる、それはまた、間接光は、シーン内の他のオブジェクトまたは表面から反射含んでもよい。光テクスチャの色は、オブジェクト(アルベド)及びレリーフ(正常)等の面であってもよいです材料シェーダの使用に関連する情報。
  • ベーキング光を使用する場合は、これらの光マップは、いわゆる、ゲーム中に変更することはできません「静的な。」光源は、実時間的に重複し、光マッピングされたシーンの使用に重畳されたが、リアルタイムで光テクスチャ自体を変更することはできません。
  • このように、我々は、潜在的にパフォーマンスを向上させるリアルタイムで計算量を減らすことによって、ゲーム内で低性能ハードウェアの適応、モバイルプラットフォームを当社の照明光を移動することができます)

  • 事前計算リアルタイムグローバルイルミネーション
  • 静的ライトマップは、シーン内の光の状況の変化に対応するが、リアルタイムGIそれが私たちのためにリアルタイムで更新することができ、複雑なシーンの照明のための技術を提供し見なされることが期待されてはいないが。
  • この方法で、あなたは豊かなグローバルイルミネーションの光と反射光環境、照明変化にリアルタイム応答を作成することができます。この典型的な例は、その日のシステム時間である:光の位置及び色が時間とともに変化します。あなたは達成できない伝統的な焼き光を、使用している場合、

  • メリットとコスト
  • あなたは光とベーキングGIのGIリアルタイム事前計算の両方を使用しますが、二つのシステムのパフォーマンスのオーバーヘッドの合計をレンダリングすると、そのコストである一方であることに注意してくださいすることができますが。私たちは、ビデオメモリにライトマップの2セットを保存する必要がありますが、また、シェーダの復号のプロセスだけではなく。
  • どのような光の性質と選択があることはどのような状況下で、ターゲットハードウェアのプロジェクトのパフォーマンスに依存します。例えば、携帯端末機のビデオメモリと処理電力制限大きく、ベーキングGI照明方法は、より高い性能を有していてもよいです。スタンドアロンコンピュータやゲームコンソール上で、最新の専用グラフィックハードウェアを持っている、リアルタイムGIに事前計算された使用することが可能であり、あるいは両方のシステムを使用することができます。
  • 私たちは、特定のプロジェクトの性質や目的のターゲットプラットフォームに基づいたアプローチを決定する必要があります。選択するためにどの方法を決定します一般的な、最低限のパフォーマンスのハードウェアでは、異なるハードウェアの範囲に直面しながら、覚えておいてください。

  • 光を追加します。
  • レンダリングモードは、レンダリングのタイプを示す:重要自動自動表し、光で表されるImpritant頂点シェーダなく、光のピクセルレンダリングによってピクセルを表します

  • レンダリングは、ピクセルライトCoutの(光によってレンダリングピクセル数)に設定し、;私たちは、通常のリソース上のシーンでプレーするので、効率があるかもしれない>品質パネル、ので、我々は、我々は良い選択の品質をレンダリング - プロジェクトの設定:レンダリング品質を設定します光の種類は、我々は、自動を選択して、すべてのUnityは頂点ごとの他は(???選ぶためにどのようにユニティ)レンダリング、6灯あたりのピクセルレンダリングを選ぶだろう必要がありますので、

  • ライトマップの設定を行い、その後、あなたは焼くを始めることができます。
  • 特定のパラメータは、ユニティ公式文書を参照することができ、Lightmapperユニティの2018年スタートは新しいプログレッシブベークを提供し、この段階的なやり方は、10時間ベーキング、ベーキング時間から、単純なシーンをライトマップ

  • データファイルの完了は、それがテクスチャとして使用するフォルダに焼成後の格納された後、同じ名前のシーンは、オブジェクトに貼り付け、ベーキングシーンで見つけることができます
  • この時点で、自動的にオブジェクトのシーンに接続されているすべてのライトをオフに行って焼成後のテクスチャ、介護オブジェクトは、まだ効果を持ちます


静的変数は、タグの文字列を定義するために使用//タグの管理クラスを追加します。

  • //トランジションエフェクトを追加明るく徐々にシーンをロードし、徐々にシーンから撤退暗く
  • この画面で、コード部分を達成RawImage閉塞を使用します。
public class ScreenFadeInOut : MonoBehaviour
{
    public float fadeSpeed = 1.5f;

    private bool sceneStarting;
    private RawImage rawImage;

    // Start is called before the first frame update
    void Start()
    {
        sceneStarting = true;
        rawImage = this.GetComponent<RawImage>();
    }

    // Update is called once per frame
    void Update()
    {
        if (sceneStarting)
        {
            rawImage.color = Color.Lerp(rawImage.color, Color.clear, fadeSpeed * Time.deltaTime);

            if (rawImage.color.a <= 0.05f)
            {
                rawImage.color = Color.clear;
                sceneStarting = false;
                rawImage.enabled = false;
            }
        }
    }

    public void EndScene()
    {
        rawImage.enabled = true;
        rawImage.color = Color.Lerp(rawImage.color, Color.black, fadeSpeed * Time.deltaTime);
        if (rawImage.color.a > 0.95f)
            SceneManager.LoadScene(0);
    }
}
  • GameControllerは、バックグラウンドミュージック、ロール管理位置を制御するための責任のゲームコントローラを追加します//
  • パニックが見つかった、目を覚まし、ループで再生するように設定され、差が通常のボリュームの効果はマスターボリュームが1のときということです我々は2つのオーディオを追加//ここに、GameControllerオーディオファイルに追加することは、我々が実現しなければならない0 //のときということですプレイヤーが発見された場合、マスターボリュームが減少し、パニックは徐々に音量を上げます
  • 具体脚本:
public class LastPlayerSighting : MonoBehaviour
{
    public Vector3 position = new Vector3(1000f, 1000f, 1000f); //表示玩家最后一次被发现的位置,如果没有被发现,就设置为默认值
    public Vector3 resetPosition = new Vector3(1000f, 1000f, 1000f);
    public float lightHighIntensity = 0.25f;  //主灯光的亮度范围
    public float lightLowIntensity = 0f;
    public float lightFadeSpeed = 7f;
    public float musicFadeSpeed = 1f;  //音乐变化的fade速率
    public bool isPlayerFound = false;

    private AlarmLight alarmLightScript;
    private Light mainLight;          //主灯光
    private AudioSource mainMusic;  //主音乐和panic时播放的音乐
    private AudioSource panicMusic;
    private AudioSource[] sirens;  //报警音乐
    private const float muteVolume = 0f; //音乐的变化范围
    private const float normalVolume = 0.8f;

    // Start is called before the first frame update
    void Start()
    {
        alarmLightScript = GameObject.FindGameObjectWithTag(Tags.ALARM_LIGHT).GetComponent<AlarmLight>();
        mainLight = GameObject.FindGameObjectWithTag(Tags.MAIN_LIGHT).GetComponent<Light>();
        mainMusic = this.GetComponent<AudioSource>();
        panicMusic = this.transform.Find("Secondary_music").GetComponent<AudioSource>();
        //sirens = new AudioSource[];
    }

    // Update is called once per frame
    void Update()
    {
        isPlayerFound = (position != resetPosition);

        //当玩家被发现时,调低主灯光,打开报警灯,淡出主音乐,淡入panic音乐, 但玩家脱离危险后恢复;
        mainLight.intensity = Mathf.Lerp(mainLight.intensity, isPlayerFound ? lightLowIntensity : lightHighIntensity, lightFadeSpeed * Time.deltaTime);
        alarmLightScript.alarmOn = isPlayerFound;
        mainMusic.volume = Mathf.Lerp(mainMusic.volume, isPlayerFound ? muteVolume : normalVolume, musicFadeSpeed);
        panicMusic.volume = Mathf.Lerp(panicMusic.volume, isPlayerFound ? normalVolume : muteVolume, musicFadeSpeed);
    }
}

CCTV Carmeraを追加します

  • // // CCTV CCTV衝突がRiggdbody成分に依存トリガ、(二つの別々の衝突トリガーお互いを防止するために)トリガーとの衝突を誘発しないであろうないRiggdbody
  • モデルCarmeraを追加
  • メッシュコライダースポット光源を追加し、
  • 衝突スクリプトを追加します:
public class CCTVCollision : MonoBehaviour
{

    private LastPlayerSighting lastPlayerSighting;

    private void Start()
    {
        lastPlayerSighting = GameObject.FindGameObjectWithTag(Tags.GAMECONTROLLER).GetComponent<LastPlayerSighting>();
    }

    private void OnTriggerStay(Collider other)
    {
        if (other.tag == Tags.PLAYER)
        {
            lastPlayerSighting.position = other.transform.position;
        }
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.tag == Tags.PLAYER)
        {
            lastPlayerSighting.position = lastPlayerSighting.resetPosition;
        }
    }
}
  • アニメーターを回転させるために追加、アニメーターは、アニメーションカーブを調整するために注意を払うする変化の速度に設定することができます

レーザーグリッド(レーザーフェンス)を追加します。

  • //は、船のラジオのためのメインカメラオーディオリスナー(1オーディオリスナーの唯一のワンシーン)に捕まります
  • 3Dの空間ブレンドを設定するには、現在のバージョンオーディオソースで//団結、テイク効果以下の3Dサウンド設定は(宇宙関連の減衰があるでしょう)
  • ライト(赤色の点光源)とオーディオソース、レーザーモデル(およびそれとシーンにマッチする)、箱コライダーを追加
  • スクリプトレーザー、レーザー制御スイッチと衝突検出フェンスを追加します。
  • フェンスレーザースイッチ:
public class LasterBlinking : MonoBehaviour
{
    public float onTime;  //灯灭的时间间隔
    public float offTime;  //灯亮的时间间隔

    private float timer;  //流逝的时间
    private Renderer laserRenerer;
    private Light laserLight;

    // Start is called before the first frame update
    void Start()
    {
        laserRenerer = GetComponent<Renderer>();
        laserLight = GetComponent<Light>();
        timer = 0;
    }

    // Update is called once per frame
    void Update()
    {
        timer += Time.deltaTime;
        if (laserRenerer.enabled && timer >= onTime)
        {
            laserRenerer.enabled = false;
            laserLight.enabled = false;
            timer = 0;
        }
        else if (!laserRenerer.enabled && timer >= offTime)
        {
            laserRenerer.enabled = true;
            laserLight.enabled = true;
            timer = 0;
        }
    }
}
  • 衝突検出:
public class LaserPlayerDetection : MonoBehaviour
{
    private void OnTriggerStay(Collider other)
    {
        if (other.tag == Tags.PLAYER && this.GetComponent<Renderer>().enabled)
        {
            LastPlayerSighting.Instance.position = other.transform.position;
        }
    }
}

おすすめ

転載: www.cnblogs.com/raymondking123/p/11491549.html