parent
bc378daf90
commit
f00c121bac
7 changed files with 4198 additions and 1133 deletions
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,24 @@ |
|||||||
|
%YAML 1.1 |
||||||
|
%TAG !u! tag:unity3d.com,2011: |
||||||
|
--- !u!114 &11400000 |
||||||
|
MonoBehaviour: |
||||||
|
m_ObjectHideFlags: 0 |
||||||
|
m_CorrespondingSourceObject: {fileID: 0} |
||||||
|
m_PrefabInstance: {fileID: 0} |
||||||
|
m_PrefabAsset: {fileID: 0} |
||||||
|
m_GameObject: {fileID: 0} |
||||||
|
m_Enabled: 1 |
||||||
|
m_EditorHideFlags: 0 |
||||||
|
m_Script: {fileID: 2050440665, guid: a4865f1ab4504ed8a368670db22f409c, type: 3} |
||||||
|
m_Name: TypeRegistryUserConfig |
||||||
|
m_EditorClassIdentifier: Sirenix.OdinInspector.Editor.dll::Sirenix.Config.TypeRegistryUserConfig |
||||||
|
shownTypes: |
||||||
|
serializedCollection: [] |
||||||
|
hiddenTypes: |
||||||
|
serializedCollection: [] |
||||||
|
addedIllegalTypes: |
||||||
|
serializedCollection: [] |
||||||
|
typeSettings: |
||||||
|
serializedDictionary: [] |
||||||
|
typePriorities: |
||||||
|
serializedDictionary: [] |
||||||
@ -0,0 +1,8 @@ |
|||||||
|
fileFormatVersion: 2 |
||||||
|
guid: fc5b9929f557fe84893bc013e8a77d6c |
||||||
|
NativeFormatImporter: |
||||||
|
externalObjects: {} |
||||||
|
mainObjectFileID: 11400000 |
||||||
|
userData: |
||||||
|
assetBundleName: |
||||||
|
assetBundleVariant: |
||||||
@ -0,0 +1,169 @@ |
|||||||
|
// Reference: https://www.behance.net/gallery/44375157/Free-Motion-Camera-Rig |
||||||
|
using UnityEngine; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.Linq; |
||||||
|
using System; |
||||||
|
#if UNITY_EDITOR |
||||||
|
using UnityEditor; |
||||||
|
#endif |
||||||
|
|
||||||
|
namespace UltraCombos |
||||||
|
{ |
||||||
|
[ExecuteAlways] |
||||||
|
public class FreeMotionCameraRig : MonoBehaviour |
||||||
|
{ |
||||||
|
[SerializeField] private int trailLength = 100; |
||||||
|
|
||||||
|
[Header("Rotations")] |
||||||
|
public float distance; |
||||||
|
public float horizontal; |
||||||
|
public float vertical; |
||||||
|
|
||||||
|
[Header("Head Extra")] |
||||||
|
[Range(-90, 90)] public float roll; |
||||||
|
[Range(-90, 90)] public float tilt; |
||||||
|
[Range(-90, 90)] public float pan; |
||||||
|
public float slide; |
||||||
|
|
||||||
|
[Header("Controllers")] |
||||||
|
[SerializeField] private Transform tiltPivot; |
||||||
|
[SerializeField] private Transform panPivot; |
||||||
|
[SerializeField] private Transform rollPivot; |
||||||
|
|
||||||
|
[Header("Automatic")] |
||||||
|
[SerializeField] private float horizontalSpeed = 0; |
||||||
|
|
||||||
|
[Header("Dev")] |
||||||
|
[SerializeField] private float uiScale = 1; |
||||||
|
|
||||||
|
private Queue<Vector3> trail = new Queue<Vector3>(); |
||||||
|
|
||||||
|
|
||||||
|
private void Start() |
||||||
|
{ |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
private void Update() |
||||||
|
{ |
||||||
|
distance = Mathf.Max(distance, 0); |
||||||
|
if (Mathf.Abs(horizontalSpeed) > 0) |
||||||
|
{ |
||||||
|
horizontal = Mathf.Repeat(horizontal + horizontalSpeed * Time.deltaTime, 360); |
||||||
|
} |
||||||
|
|
||||||
|
transform.localEulerAngles = new Vector3(vertical, horizontal, 0); |
||||||
|
|
||||||
|
if (tiltPivot) |
||||||
|
{ |
||||||
|
tiltPivot.localPosition = new Vector3(0, 0, -distance); |
||||||
|
tiltPivot.localEulerAngles = new Vector3(tilt, 0, 0); |
||||||
|
} |
||||||
|
|
||||||
|
if (panPivot) |
||||||
|
{ |
||||||
|
panPivot.localEulerAngles = new Vector3(0, pan, 0); |
||||||
|
} |
||||||
|
|
||||||
|
if (rollPivot) |
||||||
|
{ |
||||||
|
rollPivot.localPosition = new Vector3(0, 0, -slide); |
||||||
|
rollPivot.localEulerAngles = new Vector3(0, 0, -roll); |
||||||
|
} |
||||||
|
|
||||||
|
trail.Enqueue(rollPivot.position); |
||||||
|
if (trail.Count > trailLength) |
||||||
|
{ |
||||||
|
trail.Dequeue(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void OnDrawGizmosSelected() |
||||||
|
{ |
||||||
|
#if UNITY_EDITOR |
||||||
|
var rot = Quaternion.Euler(0, transform.localEulerAngles.y, 0); |
||||||
|
var trs = Matrix4x4.TRS(transform.position, rot, transform.localScale * uiScale); |
||||||
|
using (new Handles.DrawingScope(new Color32(5, 169, 245, 255), trs)) |
||||||
|
{ |
||||||
|
Handles.DrawWireDisc(Vector3.zero, Vector3.up, distance); |
||||||
|
var d = distance * 1.1f; |
||||||
|
var r = distance * 0.08f; |
||||||
|
var triangle = GetPoints(3, true) |
||||||
|
.Select(p => p * r * 2 + new Vector3(0, 0, d)) |
||||||
|
.ToArray(); |
||||||
|
Handles.DrawPolyLine(triangle); |
||||||
|
Handles.DrawWireDisc(new Vector3(+d, 0, 0), Vector3.up, r); |
||||||
|
Handles.DrawWireDisc(new Vector3(-d, 0, 0), Vector3.up, r); |
||||||
|
var circle = GetPoints(32, false); |
||||||
|
var lines = new List<Vector3>(); |
||||||
|
var cr = distance * 0.9f; |
||||||
|
for (var i = 0; i < circle.Count; ++i) |
||||||
|
{ |
||||||
|
var i2 = (i + 1) % circle.Count; |
||||||
|
lines.Add(circle[i] * cr); |
||||||
|
lines.Add(circle[i2] * cr); |
||||||
|
} |
||||||
|
Handles.DrawDottedLines(lines.ToArray(), 4); |
||||||
|
} |
||||||
|
|
||||||
|
var size = distance * 0.1f; |
||||||
|
|
||||||
|
if (tiltPivot) |
||||||
|
{ |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
if (panPivot) |
||||||
|
{ |
||||||
|
using var scp = new Handles.DrawingScope(new Color32(194, 153, 0, 255), panPivot.localToWorldMatrix); |
||||||
|
var w = size; |
||||||
|
var h = size * 2; |
||||||
|
var points = new Vector3[] { |
||||||
|
new Vector3(+w, 0, 0), |
||||||
|
new Vector3(0, 0, +h), |
||||||
|
new Vector3(-w, 0, 0), |
||||||
|
new Vector3(0, 0, -h), |
||||||
|
new Vector3(w, 0, 0) }; |
||||||
|
Handles.DrawPolyLine(points); |
||||||
|
} |
||||||
|
|
||||||
|
if (rollPivot) |
||||||
|
{ |
||||||
|
using var scp = new Handles.DrawingScope(new Color32(56, 186, 110, 255), rollPivot.localToWorldMatrix); |
||||||
|
var p0 = rollPivot.InverseTransformPoint(transform.position); |
||||||
|
Handles.DrawLine(p0, Vector3.zero); |
||||||
|
var p1 = rollPivot.InverseTransformPoint(trs.MultiplyPoint(new Vector3(0, 0, -distance))); |
||||||
|
Handles.DrawLine(p1, Vector3.zero); |
||||||
|
|
||||||
|
var w = size * 1.2f; |
||||||
|
var h = size * 0.2f; |
||||||
|
var points = new Vector3[] { |
||||||
|
new Vector3(+w, 0, -h), |
||||||
|
new Vector3(-w, 0, -h), |
||||||
|
new Vector3(0, 0, h * 4), |
||||||
|
new Vector3(+w, 0, -h) }; |
||||||
|
Handles.DrawPolyLine(points); |
||||||
|
} |
||||||
|
|
||||||
|
Handles.DrawPolyLine(trail.ToArray()); |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
private List<Vector3> GetPoints(int sides, bool close) |
||||||
|
{ |
||||||
|
var da = 2 * Mathf.PI / sides; |
||||||
|
var points = new List<Vector3>(); |
||||||
|
for (var i = 0; i < sides; i++) |
||||||
|
{ |
||||||
|
var a = da * i + Mathf.PI / 2; |
||||||
|
points.Add(new Vector3(Mathf.Cos(a), 0, Mathf.Sin(a))); |
||||||
|
} |
||||||
|
if (close) |
||||||
|
{ |
||||||
|
points.Add(points.First()); |
||||||
|
} |
||||||
|
return points; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,2 @@ |
|||||||
|
fileFormatVersion: 2 |
||||||
|
guid: 73109f7328f1df84394e8a2c3d9270f4 |
||||||
Loading…
Reference in new issue