feat(camera): add FreeMotionCameraRig script and setup

main
uc-hoba 3 weeks ago
parent bc378daf90
commit f00c121bac
  1. 5123
      Assets/Main.unity
  2. 24
      Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/TypeRegistryUserConfig.asset
  3. 8
      Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/TypeRegistryUserConfig.asset.meta
  4. 169
      Assets/Scripts/FreeMotionCameraRig.cs
  5. 2
      Assets/Scripts/FreeMotionCameraRig.cs.meta
  6. 4
      ProjectSettings/EditorBuildSettings.asset
  7. 1
      ProjectSettings/ProjectSettings.asset

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

@ -6,8 +6,8 @@ EditorBuildSettings:
serializedVersion: 2
m_Scenes:
- enabled: 1
path: Assets/Scenes/SampleScene.unity
guid: 99c9720ab356a0642a771bea13969a05
path: Assets/Main.unity
guid: 9e27af73fb025934d90889c63af29bba
m_configObjects:
com.unity.input.settings.actions: {fileID: -944628639613478452, guid: 052faaac586de48259a63d0c4782560b, type: 3}
m_UseUCBPForAssetBundles: 0

@ -832,6 +832,7 @@ PlayerSettings:
platformArchitecture: {}
scriptingBackend:
Android: 1
Standalone: 1
il2cppCompilerConfiguration: {}
il2cppCodeGeneration: {}
il2cppStacktraceInformation: {}

Loading…
Cancel
Save