【Unity】屋外と屋内でカメラの明るさを切り替える

# 実装方法
このような形で、屋外を表すColiderと屋内を表すColiderで、入口を囲い、出入りを検知して、明るさを変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/5d6dc169-671d-5a72-91b4-f4797073d027.png)

# オブジェクトの配置
## 出入りを検知したときに明るさを変えるオブジェクトを作成
空のオブジェクトを作成し、任意の名前を付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/c9cd82bd-1d75-e9b5-8300-c7f63500d5d5.png)

## 出入りを検知するオブジェクトを作成
- 上記で作成したオブジェクトの子オブジェクトとして、空のオブジェクトを二つ作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/bfbf3662-3388-4b93-851d-680b150bcc67.png)
- それぞれに、BoxColider（IsTrrigerをtrueにしておく）を追加し、入口に配置します（Outdoorは屋外側、Indoorは屋内側にしておきましょう）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/fc645dbe-c23e-227f-65b1-fc72ec2456a5.png)

# スクリプトの作成
## トリガーを検知しイベントを発火するスクリプト
- 下記のスクリプトを作成し、OutdoorとIndoorにアタッチします
```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Experimental.GlobalIllumination;

public class LightingChangeTrigger : MonoBehaviour
{
    public UnityEvent OnTriggerEnterEvent = new UnityEvent();

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            OnTriggerEnterEvent.Invoke();
        }
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/7dd5144f-05c2-f104-a0f4-76c46d83f61b.png)

## 光の強さを変えるスクリプトを作成
- 下記のスクリプトを作成し、LightingChangeにアタッチします
```csharp
using UnityEngine;
using UnityEngine.Rendering;

public class LightingChangeController : MonoBehaviour
{
    [SerializeField]
    private float _outdoorLightIntensity = 1.0f;
    [SerializeField]
    private float _indoorLightIntensity = 0.8f;
    [SerializeField]
    private float _transitionSpeed = 2.0f;

    private float _targetLightIntensity;
    private bool _isTriggerEnterOutdoor;
    private bool _isTriggerEnterIndoor;

    /// <summary>
    /// 先に外のコライダーがトリガーしたか
    /// </summary>
    /// <remarks>
    /// true: 外から室内
    /// false: 室内から外
    /// </remarks>
    private bool _isFirstTriggerEnterFromOutdoor; 

    private void Start()
    {
        _targetLightIntensity = RenderSettings.ambientIntensity;
    }

    private void Update()
    {
        if(_isTriggerEnterIndoor && _isTriggerEnterOutdoor)
        {
            _isTriggerEnterIndoor = false;
            _isTriggerEnterOutdoor = false;
            _targetLightIntensity = _isFirstTriggerEnterFromOutdoor ? _indoorLightIntensity : _outdoorLightIntensity;
        }

        if(RenderSettings.ambientIntensity != _targetLightIntensity)
        {
            RenderSettings.ambientIntensity = Mathf.Lerp(RenderSettings.ambientIntensity, _targetLightIntensity, Time.deltaTime * _transitionSpeed);
            if (Mathf.Abs(RenderSettings.ambientIntensity - _targetLightIntensity) < 0.001f)
            {
                RenderSettings.ambientIntensity = _targetLightIntensity;
            }
        }
    }

    public void OnTriggerEnterOutdoor()
    {
        if (!_isTriggerEnterIndoor)
        {
            _isFirstTriggerEnterFromOutdoor = true;
        }
        _isTriggerEnterOutdoor = true;
    }

    public void OnTriggerEnterIndoor()
    {
        if (!_isTriggerEnterOutdoor)
        {
            _isFirstTriggerEnterFromOutdoor = false;
        }
        _isTriggerEnterIndoor = true;
    }
}


```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/135a00e3-f88b-7749-d115-dfc670c81d7a.png)

## イベントを登録
- Outdoorを選択し、OnTriggerEnterEventで+ボタンを押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/310ca895-dc1b-221a-9272-eadd67529332.png)

- オブジェクトの部分に、HierarchyのLightingChangeをドラッグアンドドロップします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/443df840-f438-4944-b0a5-c8fbc0f319e3.png)
- No Functionをクリックし、LightingChangeControllerのOnTriggerEnterOutdoorのメソッドを登録します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/91da5b7b-db68-6071-1c7b-d921b5607511.png)
- Indoorも同じように操作し、メソッドはOnTriggerEnterIndoorを登録します

:::note warn
登録するメソッドを間違えないように注意してください。
Outdoorには、OnTriggerEnterOutdoor、
Indoorには、OnTriggerEnterIndoorを登録します
:::

# Playerの設定
明るさを切り替えるタイミングは、Coliderが設定されている、かつ、Playerというタグが付いているオブジェクトが通過したときになりますので、
お使いのシーンで通過したときに明るさを変えたいオブジェクトを見直し、ColiderとPlayerというタグがなければ追加してください