mirror of
https://github.com/RHeavenStudio/HeavenStudio.git
synced 2025-06-13 08:37:37 +02:00
Global Camera Movement (#80)
* Global Camera: move Spaceball to new system * Global Camera: holy shit I'm done already?????
This commit is contained in:
@ -2,6 +2,9 @@ using System.Collections;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
|
using HeavenStudio.Util;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace HeavenStudio
|
namespace HeavenStudio
|
||||||
{
|
{
|
||||||
public class GameCamera : MonoBehaviour
|
public class GameCamera : MonoBehaviour
|
||||||
@ -9,6 +12,42 @@ namespace HeavenStudio
|
|||||||
public static GameCamera instance { get; private set; }
|
public static GameCamera instance { get; private set; }
|
||||||
public new Camera camera;
|
public new Camera camera;
|
||||||
|
|
||||||
|
private List<Beatmap.Entity> positionEvents = new List<Beatmap.Entity>();
|
||||||
|
private List<Beatmap.Entity> rotationEvents = new List<Beatmap.Entity>();
|
||||||
|
private List<Beatmap.Entity> scaleEvents = new List<Beatmap.Entity>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
default cam position, for quick-resetting
|
||||||
|
**/
|
||||||
|
static Vector3 defaultPosition = new Vector3(0, 0, -10);
|
||||||
|
static Vector3 defaultRotEluer = new Vector3(0, 0, 0);
|
||||||
|
static Vector3 defaultScale = new Vector3(16, 9, 1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
camera's current transformation
|
||||||
|
TODO: stretching (the scale param) not working, will need help with this cause I don't understand Unity's camera
|
||||||
|
**/
|
||||||
|
private static Vector3 position;
|
||||||
|
private static Vector3 rotEluer;
|
||||||
|
private static Vector3 scale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
camera's last transformation
|
||||||
|
TODO: stretching (the scaleLast param) not working, will need help with this cause I don't understand Unity's camera
|
||||||
|
**/
|
||||||
|
private static Vector3 positionLast;
|
||||||
|
private static Vector3 rotEluerLast;
|
||||||
|
private static Vector3 scaleLast;
|
||||||
|
|
||||||
|
/**
|
||||||
|
transformations to apply *after* the global transform,
|
||||||
|
to use in minigame scripts (Spaceball, Rhythm Rally, Built to Scale, etc.)
|
||||||
|
and NOT in the editor
|
||||||
|
**/
|
||||||
|
public static Vector3 additionalPosition;
|
||||||
|
public static Vector3 additionalRotEluer;
|
||||||
|
public static Vector3 additionalScale;
|
||||||
|
|
||||||
[Header("Components")]
|
[Header("Components")]
|
||||||
public Color baseColor;
|
public Color baseColor;
|
||||||
|
|
||||||
@ -20,7 +59,108 @@ namespace HeavenStudio
|
|||||||
|
|
||||||
private void Start()
|
private void Start()
|
||||||
{
|
{
|
||||||
|
GameManager.instance.onBeatChanged += OnBeatChanged;
|
||||||
camera.backgroundColor = baseColor;
|
camera.backgroundColor = baseColor;
|
||||||
|
|
||||||
|
ResetTransforms();
|
||||||
|
ResetAdditionalTransforms();
|
||||||
|
|
||||||
|
positionLast = defaultPosition;
|
||||||
|
rotEluerLast = defaultRotEluer;
|
||||||
|
scaleLast = defaultScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnBeatChanged(float beat)
|
||||||
|
{
|
||||||
|
ResetTransforms();
|
||||||
|
ResetAdditionalTransforms();
|
||||||
|
|
||||||
|
positionLast = defaultPosition;
|
||||||
|
rotEluerLast = defaultRotEluer;
|
||||||
|
scaleLast = defaultScale;
|
||||||
|
|
||||||
|
// this entire thing is a mess redo it later
|
||||||
|
//pos
|
||||||
|
positionEvents = EventCaller.GetAllInGameManagerList("gameManager", new string[] { "move camera" });
|
||||||
|
|
||||||
|
//rot
|
||||||
|
rotationEvents = EventCaller.GetAllInGameManagerList("gameManager", new string[] { "rotate camera" });
|
||||||
|
|
||||||
|
//scale (TODO)
|
||||||
|
// scaleEvents = EventCaller.GetAllInGameManagerList("gameManager", new string[] { "scale camera" });
|
||||||
|
|
||||||
|
UpdateCameraTranslate();
|
||||||
|
UpdateCameraRotate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
UpdateCameraTranslate();
|
||||||
|
UpdateCameraRotate();
|
||||||
|
|
||||||
|
Camera cam = GetCamera();
|
||||||
|
cam.transform.localPosition = position + additionalPosition;
|
||||||
|
cam.transform.eulerAngles = rotEluer + additionalRotEluer;
|
||||||
|
cam.transform.localScale = Vector3.Scale(scale, additionalScale);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateCameraTranslate()
|
||||||
|
{
|
||||||
|
foreach (var e in positionEvents)
|
||||||
|
{
|
||||||
|
float prog = Conductor.instance.GetPositionFromBeat(e.beat, e.length);
|
||||||
|
if (prog >= 0f)
|
||||||
|
{
|
||||||
|
EasingFunction.Function func = EasingFunction.GetEasingFunction(e.ease);
|
||||||
|
float dx = func(positionLast.x, e.valA, Mathf.Min(prog, 1f));
|
||||||
|
float dy = func(positionLast.y, e.valB, Mathf.Min(prog, 1f));
|
||||||
|
float dz = func(positionLast.z, -e.valC, Mathf.Min(prog, 1f));
|
||||||
|
position = new Vector3(dx, dy, dz);
|
||||||
|
}
|
||||||
|
if (prog > 1f)
|
||||||
|
{
|
||||||
|
positionLast = new Vector3(e.valA, e.valB, -e.valC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateCameraRotate()
|
||||||
|
{
|
||||||
|
foreach (var e in rotationEvents)
|
||||||
|
{
|
||||||
|
float prog = Conductor.instance.GetPositionFromBeat(e.beat, e.length);
|
||||||
|
if (prog >= 0f)
|
||||||
|
{
|
||||||
|
EasingFunction.Function func = EasingFunction.GetEasingFunction(e.ease);
|
||||||
|
float dx = func(rotEluerLast.x, e.valA, Mathf.Min(prog, 1f));
|
||||||
|
float dy = func(rotEluerLast.y, e.valB, Mathf.Min(prog, 1f));
|
||||||
|
float dz = func(rotEluerLast.z, e.valC, Mathf.Min(prog, 1f));
|
||||||
|
rotEluer = new Vector3(dx, dy, dz);
|
||||||
|
}
|
||||||
|
if (prog > 1f)
|
||||||
|
{
|
||||||
|
rotEluerLast = new Vector3(e.valA, e.valB, -e.valC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ResetTransforms()
|
||||||
|
{
|
||||||
|
position = defaultPosition;
|
||||||
|
rotEluer = defaultRotEluer;
|
||||||
|
scale = defaultScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ResetAdditionalTransforms()
|
||||||
|
{
|
||||||
|
additionalPosition = new Vector3(0, 0, 0);
|
||||||
|
additionalRotEluer = new Vector3(0, 0, 0);
|
||||||
|
additionalScale = new Vector3(1, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Camera GetCamera()
|
||||||
|
{
|
||||||
|
return instance.camera;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -444,7 +444,7 @@ namespace HeavenStudio
|
|||||||
|
|
||||||
public void ResetCamera()
|
public void ResetCamera()
|
||||||
{
|
{
|
||||||
GameCamera.transform.localPosition = new Vector3(0, 0, -10);
|
HeavenStudio.GameCamera.ResetAdditionalTransforms();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -117,27 +117,27 @@ namespace HeavenStudio.Games
|
|||||||
{
|
{
|
||||||
if (normalizedBeat > 1)
|
if (normalizedBeat > 1)
|
||||||
{
|
{
|
||||||
GameCamera.instance.camera.transform.localPosition = new Vector3(0, 0, currentZoomCamDistance);
|
GameCamera.additionalPosition = new Vector3(0, 0, currentZoomCamDistance + 10);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (currentZoomCamLength < 0)
|
if (currentZoomCamLength < 0)
|
||||||
{
|
{
|
||||||
GameCamera.instance.camera.transform.localPosition = new Vector3(0, 0, currentZoomCamDistance);
|
GameCamera.additionalPosition = new Vector3(0, 0, currentZoomCamDistance + 10);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
EasingFunction.Function func = EasingFunction.GetEasingFunction(lastEase);
|
EasingFunction.Function func = EasingFunction.GetEasingFunction(lastEase);
|
||||||
|
|
||||||
float newPosZ = func(lastCamDistance, currentZoomCamDistance, normalizedBeat);
|
float newPosZ = func(lastCamDistance + 10, currentZoomCamDistance + 10, normalizedBeat);
|
||||||
GameCamera.instance.camera.transform.localPosition = new Vector3(0, 0, newPosZ);
|
GameCamera.additionalPosition = new Vector3(0, 0, newPosZ);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// ?
|
// ?
|
||||||
GameCamera.instance.camera.transform.localPosition = new Vector3(0, 0, -10f);
|
GameCamera.additionalPosition = new Vector3(0, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -149,6 +149,28 @@ namespace HeavenStudio
|
|||||||
{
|
{
|
||||||
new Param("toggle", true, "Enable Inputs")
|
new Param("toggle", true, "Enable Inputs")
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
new GameAction("move camera", delegate
|
||||||
|
{
|
||||||
|
//TODO: move cam
|
||||||
|
}, 1f, true, new List<Param>()
|
||||||
|
{
|
||||||
|
new Param("valA", new EntityTypes.Float(-50, 50, 0), "Right / Left"),
|
||||||
|
new Param("valB", new EntityTypes.Float(-50, 50, 0), "Up / Down"),
|
||||||
|
new Param("valC", new EntityTypes.Float(-0, 250, 10), "In / Out"),
|
||||||
|
new Param("ease", EasingFunction.Ease.Linear, "Ease Type")
|
||||||
|
} ),
|
||||||
|
|
||||||
|
new GameAction("rotate camera", delegate
|
||||||
|
{
|
||||||
|
//TODO: rot cam
|
||||||
|
}, 1f, true, new List<Param>()
|
||||||
|
{
|
||||||
|
new Param("valA", new EntityTypes.Integer(-360, 360, 0), "Pitch"),
|
||||||
|
new Param("valB", new EntityTypes.Integer(-360, 360, 0), "Yaw"),
|
||||||
|
new Param("valC", new EntityTypes.Integer(-360, 360, 0), "Roll"),
|
||||||
|
new Param("ease", EasingFunction.Ease.Linear, "Ease Type")
|
||||||
|
} ),
|
||||||
}),
|
}),
|
||||||
new Minigame("countIn", "Count-Ins", "", false, true, new List<GameAction>()
|
new Minigame("countIn", "Count-Ins", "", false, true, new List<GameAction>()
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user