OSDN Git Service

Undid HDRP
[mindgames/Mindgames_main.git] / Mindgames / Assets / Plugins / Pixel Crushers / Scene Streamer / Example / Scripts / SmoothMouseLook.cs
1 // From: https://wiki.unity3d.com/index.php/SmoothMouseLook
2 // Modified:
3 // 1. Namespace to prevent conflicts.
4 // 2. Only checks Mouse X and Mouse Y inputs.
5
6 namespace PixelCrushers.SceneStreamer.Example
7 {
8     using UnityEngine;
9     using System.Collections;
10     using System.Collections.Generic;
11
12     [AddComponentMenu("Camera-Control/Smooth Mouse Look")]
13     public class SmoothMouseLook : MonoBehaviour
14     {
15
16         public enum RotationAxes { MouseXAndY = 0, MouseX = 1, MouseY = 2 }
17         public RotationAxes axes = RotationAxes.MouseXAndY;
18         public float sensitivityX = 15F;
19         public float sensitivityY = 15F;
20
21         public float minimumX = -360F;
22         public float maximumX = 360F;
23
24         public float minimumY = -60F;
25         public float maximumY = 60F;
26
27         float rotationX = 0F;
28         float rotationY = 0F;
29
30         private List<float> rotArrayX = new List<float>();
31         float rotAverageX = 0F;
32
33         private List<float> rotArrayY = new List<float>();
34         float rotAverageY = 0F;
35
36         public float frameCounter = 20;
37
38         Quaternion originalRotation;
39
40
41         void Update()
42         {
43             if (axes == RotationAxes.MouseXAndY)
44             {
45                 rotAverageY = 0f;
46                 rotAverageX = 0f;
47
48                 rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
49                 rotationX += Input.GetAxis("Mouse X") * sensitivityX;
50
51                 rotArrayY.Add(rotationY);
52                 rotArrayX.Add(rotationX);
53
54                 if (rotArrayY.Count >= frameCounter)
55                 {
56                     rotArrayY.RemoveAt(0);
57                 }
58                 if (rotArrayX.Count >= frameCounter)
59                 {
60                     rotArrayX.RemoveAt(0);
61                 }
62
63                 for (int j = 0; j < rotArrayY.Count; j++)
64                 {
65                     rotAverageY += rotArrayY[j];
66                 }
67                 for (int i = 0; i < rotArrayX.Count; i++)
68                 {
69                     rotAverageX += rotArrayX[i];
70                 }
71
72                 rotAverageY /= rotArrayY.Count;
73                 rotAverageX /= rotArrayX.Count;
74
75                 rotAverageY = ClampAngle(rotAverageY, minimumY, maximumY);
76                 rotAverageX = ClampAngle(rotAverageX, minimumX, maximumX);
77
78                 Quaternion yQuaternion = Quaternion.AngleAxis(rotAverageY, Vector3.left);
79                 Quaternion xQuaternion = Quaternion.AngleAxis(rotAverageX, Vector3.up);
80
81                 transform.localRotation = originalRotation * xQuaternion * yQuaternion;
82             }
83             else if (axes == RotationAxes.MouseX)
84             {
85                 rotAverageX = 0f;
86
87                 rotationX += Input.GetAxis("Mouse X") * sensitivityX;
88
89                 rotArrayX.Add(rotationX);
90
91                 if (rotArrayX.Count >= frameCounter)
92                 {
93                     rotArrayX.RemoveAt(0);
94                 }
95                 for (int i = 0; i < rotArrayX.Count; i++)
96                 {
97                     rotAverageX += rotArrayX[i];
98                 }
99                 rotAverageX /= rotArrayX.Count;
100
101                 rotAverageX = ClampAngle(rotAverageX, minimumX, maximumX);
102
103                 Quaternion xQuaternion = Quaternion.AngleAxis(rotAverageX, Vector3.up);
104                 transform.localRotation = originalRotation * xQuaternion;
105             }
106             else
107             {
108                 rotAverageY = 0f;
109
110                 rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
111
112                 rotArrayY.Add(rotationY);
113
114                 if (rotArrayY.Count >= frameCounter)
115                 {
116                     rotArrayY.RemoveAt(0);
117                 }
118                 for (int j = 0; j < rotArrayY.Count; j++)
119                 {
120                     rotAverageY += rotArrayY[j];
121                 }
122                 rotAverageY /= rotArrayY.Count;
123
124                 rotAverageY = ClampAngle(rotAverageY, minimumY, maximumY);
125
126                 Quaternion yQuaternion = Quaternion.AngleAxis(rotAverageY, Vector3.left);
127                 transform.localRotation = originalRotation * yQuaternion;
128             }
129         }
130
131         void Start()
132         {
133             Rigidbody rb = GetComponent<Rigidbody>();
134             if (rb)
135                 rb.freezeRotation = true;
136             originalRotation = transform.localRotation;
137             Cursor.visible = false;
138             Cursor.lockState = CursorLockMode.Locked;
139         }
140
141         public static float ClampAngle(float angle, float min, float max)
142         {
143             angle = angle % 360;
144             if ((angle >= -360F) && (angle <= 360F))
145             {
146                 if (angle < -360F)
147                 {
148                     angle += 360F;
149                 }
150                 if (angle > 360F)
151                 {
152                     angle -= 360F;
153                 }
154             }
155             return Mathf.Clamp(angle, min, max);
156         }
157     }
158 }