mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-04-18 13:07:48 -05:00
FindObjectsBy系のAPIは、UniVRMがサポートしているUnityのうち、次の範囲のバージョンには存在しない。 - 2021.3.0~2021.3.17 - 2022.1.0~2022.1.24 - 2022.2.0~2022.2.4 そのため、該当するバージョンのUnityではコンパイルエラーが発生していた。UNITY_2022_3_OR_NEWERで分岐することで、旧APIと新APIを安全に選択するようにした。 厳密にはUNITY_2022_2_5_OR_NEWERを用いたいが、そのようなシンボルは存在していなかった。
96 lines
3.1 KiB
C#
96 lines
3.1 KiB
C#
#pragma warning disable 0414, 0649
|
|
using UnityEngine;
|
|
using System.Linq;
|
|
using UnityEngine.UI;
|
|
using System;
|
|
|
|
namespace VRM
|
|
{
|
|
/// <summary>
|
|
/// ファーストパーソン向けLayer検討
|
|
///
|
|
/// * Default LayerをFirstPersonレイヤーとして使う
|
|
/// * 9番にThirdPerson Layerを追加する
|
|
///
|
|
/// * FirstPersonCameraはCullingMaskでThirdPerson Layerを除外
|
|
/// * ThirdPersonCameraはCullingMaskでDefault Layerを除外
|
|
///
|
|
/// * それ以外のシーンオブジェクトはDefaultLayerとThirdPersonレイヤーの両方に所属するべし
|
|
/// * 首無しモデルはDefault Layerのみに所属するべし
|
|
/// * 首有りモデルはThirdPerson Layerのみに所属するべし
|
|
/// * コントローラーはDefault Layerがいいかも
|
|
/// * 鏡もDefault Layerがいいかも(カメラごとにRenderTargetを用意するのは煩雑)
|
|
/// </summary>
|
|
public class VRMFirstPersonCameraManager : MonoBehaviour
|
|
{
|
|
[Serializable]
|
|
class CameraWithRawImage
|
|
{
|
|
public Camera Camera;
|
|
public RenderTexture Texture;
|
|
public RawImage Image;
|
|
}
|
|
|
|
/// <summary>
|
|
/// FirstPerson
|
|
/// </summary>
|
|
[SerializeField]
|
|
CameraWithRawImage m_topLeft;
|
|
|
|
/// <summary>
|
|
/// ThirdPerson body
|
|
/// </summary>
|
|
[SerializeField]
|
|
CameraWithRawImage m_topRight;
|
|
|
|
/// <summary>
|
|
/// ThirdPerson head
|
|
/// </summary>
|
|
[SerializeField]
|
|
CameraWithRawImage m_bottomRight;
|
|
|
|
[SerializeField, Header("Cameras")]
|
|
Camera m_firstPersonCamera;
|
|
|
|
[SerializeField]
|
|
Camera[] m_thirdPersonCameras;
|
|
|
|
void Reset()
|
|
{
|
|
#if UNITY_2022_3_OR_NEWER
|
|
var cameras = GameObject.FindObjectsByType<Camera>(FindObjectsSortMode.InstanceID);
|
|
#else
|
|
var cameras = GameObject.FindObjectsOfType<Camera>();
|
|
#endif
|
|
m_firstPersonCamera = Camera.main;
|
|
m_thirdPersonCameras = cameras.Where(x => x != m_firstPersonCamera).ToArray();
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
var halfWidth = Screen.width / 2;
|
|
var halfHeight = Screen.height / 2;
|
|
SetupRenderTarget(m_topLeft, halfWidth, halfHeight);
|
|
SetupRenderTarget(m_topRight, halfWidth, halfHeight);
|
|
SetupRenderTarget(m_bottomRight, halfWidth, halfHeight);
|
|
}
|
|
|
|
void SetupRenderTarget(CameraWithRawImage cameraWithImage, int w, int h)
|
|
{
|
|
if (cameraWithImage.Camera == null) return;
|
|
if (cameraWithImage.Image == null) return;
|
|
|
|
if (cameraWithImage.Texture == null
|
|
|| cameraWithImage.Texture.width != w
|
|
|| cameraWithImage.Texture.height != h
|
|
)
|
|
{
|
|
var texture = new RenderTexture(w, h, 16);
|
|
cameraWithImage.Texture = texture;
|
|
cameraWithImage.Camera.targetTexture = texture;
|
|
cameraWithImage.Image.texture = texture;
|
|
}
|
|
}
|
|
}
|
|
}
|