VRMFirstPersonCameraManager.cs
2.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#pragma warning disable 0414, 0649
using UnityEngine;
using System.Linq;
using UnityEngine.UI;
using System;
namespace VRM
{
/// <summary>
/// ファーストパーソン向けLayer検討
///
/// * Deault 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()
{
var cameras = GameObject.FindObjectsOfType<Camera>();
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;
}
}
}
}