feat: polish VR gameplay and sync tools
This commit is contained in:
@@ -39,6 +39,11 @@ namespace VRBeats
|
||||
|
||||
if (Cut(info.hitPoint, cutDir, insideMaterial))
|
||||
{
|
||||
Color trailColor = beatCube != null
|
||||
? VR_BeatManager.instance.GetColorFromColorSide(beatCube.ThisColorSide)
|
||||
: Color.white;
|
||||
Vector3 saberUp = beatDamageInfo.hitObject != null ? beatDamageInfo.hitObject.transform.up : cutDir;
|
||||
SliceTrailEffect.Spawn(info.hitPoint, info.hitDir, saberUp, trailColor);
|
||||
Destroy(gameObject);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,450 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
|
||||
namespace VRBeats
|
||||
{
|
||||
/// <summary>
|
||||
/// Builds a short world-space ribbon from the whole saber blade instead of
|
||||
/// attaching a TrailRenderer to the tip. This keeps the afterimage on the
|
||||
/// blade surface and avoids the "propeller" look from a single end point.
|
||||
/// </summary>
|
||||
public class SaberTrailEffect : MonoBehaviour
|
||||
{
|
||||
private const int MaxSamples = 18;
|
||||
private const float TrailLifetime = 0.13f;
|
||||
private const float MinSwingSpeed = 0.75f;
|
||||
private const float MinSampleDistance = 0.012f;
|
||||
private const float BladeBaseT = 0.10f;
|
||||
private const float BladeTipT = 0.98f;
|
||||
|
||||
private readonly List<BladeSample> samples = new List<BladeSample>(MaxSamples);
|
||||
private readonly List<Vector3> vertices = new List<Vector3>(MaxSamples * 2);
|
||||
private readonly List<Color> colors = new List<Color>(MaxSamples * 2);
|
||||
private readonly List<Vector2> uvs = new List<Vector2>(MaxSamples * 2);
|
||||
private readonly List<int> triangles = new List<int>((MaxSamples - 1) * 12);
|
||||
|
||||
private Transform bladeStart;
|
||||
private Transform bladeEnd;
|
||||
private GameObject wideObject;
|
||||
private GameObject coreObject;
|
||||
private Mesh wideMesh;
|
||||
private Mesh coreMesh;
|
||||
private MeshRenderer wideRenderer;
|
||||
private MeshRenderer coreRenderer;
|
||||
private Material wideMaterial;
|
||||
private Material coreMaterial;
|
||||
|
||||
private Color trailColor = Color.cyan;
|
||||
private bool visible = true;
|
||||
private bool hasLastFrame;
|
||||
private Vector3 lastBase;
|
||||
private Vector3 lastTip;
|
||||
|
||||
private struct BladeSample
|
||||
{
|
||||
public Vector3 basePos;
|
||||
public Vector3 tipPos;
|
||||
public float time;
|
||||
}
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
RemoveLegacyTrailRenderers();
|
||||
ResolveBladeAnchors();
|
||||
EnsureRenderers();
|
||||
SetColor(trailColor);
|
||||
SetVisible(visible);
|
||||
}
|
||||
|
||||
private void LateUpdate()
|
||||
{
|
||||
if (!visible)
|
||||
{
|
||||
Clear();
|
||||
hasLastFrame = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (bladeEnd == null)
|
||||
{
|
||||
ResolveBladeAnchors();
|
||||
}
|
||||
|
||||
Vector3 basePos;
|
||||
Vector3 tipPos;
|
||||
GetBladeSegment(out basePos, out tipPos);
|
||||
|
||||
float now = Time.time;
|
||||
float speed = 0f;
|
||||
float moved = 0f;
|
||||
|
||||
if (hasLastFrame)
|
||||
{
|
||||
float deltaTime = Mathf.Max(Time.deltaTime, 0.0001f);
|
||||
speed = Mathf.Max(
|
||||
Vector3.Distance(basePos, lastBase),
|
||||
Vector3.Distance(tipPos, lastTip)) / deltaTime;
|
||||
moved = Mathf.Max(
|
||||
Vector3.Distance(basePos, lastBase),
|
||||
Vector3.Distance(tipPos, lastTip));
|
||||
}
|
||||
|
||||
if (!hasLastFrame || (speed >= MinSwingSpeed && moved >= MinSampleDistance))
|
||||
{
|
||||
AddSample(basePos, tipPos, now);
|
||||
}
|
||||
|
||||
TrimExpiredSamples(now);
|
||||
BuildRibbon(wideMesh, now, 0f, 1f, trailColor, 0.10f, 0.36f);
|
||||
|
||||
Color coreColor = Color.Lerp(Color.white, trailColor, 0.45f);
|
||||
BuildRibbon(coreMesh, now, 0.42f, 1f, coreColor, 0.14f, 0.48f);
|
||||
|
||||
lastBase = basePos;
|
||||
lastTip = tipPos;
|
||||
hasLastFrame = true;
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
Clear();
|
||||
hasLastFrame = false;
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
DestroyRuntimeObject(wideObject);
|
||||
DestroyRuntimeObject(coreObject);
|
||||
DestroyRuntimeObject(wideMesh);
|
||||
DestroyRuntimeObject(coreMesh);
|
||||
DestroyRuntimeObject(wideMaterial);
|
||||
DestroyRuntimeObject(coreMaterial);
|
||||
}
|
||||
|
||||
public void SetVisible(bool value)
|
||||
{
|
||||
visible = value;
|
||||
|
||||
if (wideRenderer != null)
|
||||
{
|
||||
wideRenderer.enabled = value;
|
||||
}
|
||||
|
||||
if (coreRenderer != null)
|
||||
{
|
||||
coreRenderer.enabled = value;
|
||||
}
|
||||
|
||||
if (!value)
|
||||
{
|
||||
Clear();
|
||||
hasLastFrame = false;
|
||||
}
|
||||
}
|
||||
|
||||
public void SetColor(Color color)
|
||||
{
|
||||
trailColor = NormalizeColor(color);
|
||||
EnsureRenderers();
|
||||
ApplyMaterialColor(wideMaterial, trailColor, 0.34f);
|
||||
|
||||
Color coreColor = Color.Lerp(Color.white, trailColor, 0.45f);
|
||||
ApplyMaterialColor(coreMaterial, coreColor, 0.50f);
|
||||
}
|
||||
|
||||
private void ResolveBladeAnchors()
|
||||
{
|
||||
bladeStart = FindChildRecursive(transform, "Start");
|
||||
bladeEnd = FindChildRecursive(transform, "End");
|
||||
|
||||
if (bladeEnd == null)
|
||||
{
|
||||
bladeEnd = transform;
|
||||
}
|
||||
|
||||
if (bladeStart == null)
|
||||
{
|
||||
bladeStart = transform;
|
||||
}
|
||||
}
|
||||
|
||||
private void GetBladeSegment(out Vector3 basePos, out Vector3 tipPos)
|
||||
{
|
||||
Vector3 start = bladeStart != null ? bladeStart.position : transform.position;
|
||||
Vector3 end = bladeEnd != null ? bladeEnd.position : transform.position + transform.forward;
|
||||
|
||||
if (Vector3.Distance(start, end) < 0.001f)
|
||||
{
|
||||
end = start + transform.forward * 0.8f;
|
||||
}
|
||||
|
||||
basePos = Vector3.Lerp(start, end, BladeBaseT);
|
||||
tipPos = Vector3.Lerp(start, end, BladeTipT);
|
||||
}
|
||||
|
||||
private void AddSample(Vector3 basePos, Vector3 tipPos, float time)
|
||||
{
|
||||
if (samples.Count >= MaxSamples)
|
||||
{
|
||||
samples.RemoveAt(0);
|
||||
}
|
||||
|
||||
samples.Add(new BladeSample
|
||||
{
|
||||
basePos = basePos,
|
||||
tipPos = tipPos,
|
||||
time = time
|
||||
});
|
||||
}
|
||||
|
||||
private void TrimExpiredSamples(float now)
|
||||
{
|
||||
for (int i = samples.Count - 1; i >= 0; i--)
|
||||
{
|
||||
if (now - samples[i].time > TrailLifetime)
|
||||
{
|
||||
samples.RemoveAt(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void BuildRibbon(Mesh mesh, float now, float innerT, float outerT, Color color, float innerAlpha, float outerAlpha)
|
||||
{
|
||||
if (mesh == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
vertices.Clear();
|
||||
colors.Clear();
|
||||
uvs.Clear();
|
||||
triangles.Clear();
|
||||
|
||||
if (samples.Count < 2)
|
||||
{
|
||||
mesh.Clear();
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < samples.Count; i++)
|
||||
{
|
||||
BladeSample sample = samples[i];
|
||||
float age01 = Mathf.Clamp01((now - sample.time) / TrailLifetime);
|
||||
float fade = Mathf.Pow(1f - age01, 1.7f);
|
||||
float along = samples.Count <= 1 ? 0f : i / (float)(samples.Count - 1);
|
||||
|
||||
Vector3 inner = Vector3.Lerp(sample.basePos, sample.tipPos, innerT);
|
||||
Vector3 outer = Vector3.Lerp(sample.basePos, sample.tipPos, outerT);
|
||||
|
||||
vertices.Add(inner);
|
||||
vertices.Add(outer);
|
||||
colors.Add(WithAlpha(color, fade * innerAlpha));
|
||||
colors.Add(WithAlpha(color, fade * outerAlpha));
|
||||
uvs.Add(new Vector2(0f, along));
|
||||
uvs.Add(new Vector2(1f, along));
|
||||
}
|
||||
|
||||
for (int i = 0; i < samples.Count - 1; i++)
|
||||
{
|
||||
int a = i * 2;
|
||||
int b = a + 1;
|
||||
int c = a + 2;
|
||||
int d = a + 3;
|
||||
|
||||
triangles.Add(a);
|
||||
triangles.Add(b);
|
||||
triangles.Add(c);
|
||||
triangles.Add(b);
|
||||
triangles.Add(d);
|
||||
triangles.Add(c);
|
||||
|
||||
triangles.Add(c);
|
||||
triangles.Add(b);
|
||||
triangles.Add(a);
|
||||
triangles.Add(c);
|
||||
triangles.Add(d);
|
||||
triangles.Add(b);
|
||||
}
|
||||
|
||||
mesh.Clear();
|
||||
mesh.SetVertices(vertices);
|
||||
mesh.SetColors(colors);
|
||||
mesh.SetUVs(0, uvs);
|
||||
mesh.SetTriangles(triangles, 0);
|
||||
mesh.RecalculateBounds();
|
||||
}
|
||||
|
||||
private void EnsureRenderers()
|
||||
{
|
||||
if (wideObject == null)
|
||||
{
|
||||
wideRenderer = CreateRibbonObject("SaberBladeAfterimage_Wide", out wideObject, out wideMesh, out wideMaterial, false);
|
||||
}
|
||||
|
||||
if (coreObject == null)
|
||||
{
|
||||
coreRenderer = CreateRibbonObject("SaberBladeAfterimage_Core", out coreObject, out coreMesh, out coreMaterial, true);
|
||||
}
|
||||
}
|
||||
|
||||
private MeshRenderer CreateRibbonObject(string objectName, out GameObject ribbonObject, out Mesh mesh, out Material material, bool additive)
|
||||
{
|
||||
ribbonObject = new GameObject(objectName);
|
||||
ribbonObject.hideFlags = HideFlags.DontSave;
|
||||
ribbonObject.transform.SetPositionAndRotation(Vector3.zero, Quaternion.identity);
|
||||
ribbonObject.transform.localScale = Vector3.one;
|
||||
|
||||
mesh = new Mesh
|
||||
{
|
||||
name = objectName + " Mesh"
|
||||
};
|
||||
mesh.MarkDynamic();
|
||||
|
||||
MeshFilter filter = ribbonObject.AddComponent<MeshFilter>();
|
||||
filter.sharedMesh = mesh;
|
||||
|
||||
MeshRenderer renderer = ribbonObject.AddComponent<MeshRenderer>();
|
||||
material = CreateTrailMaterial(objectName + " Material", additive);
|
||||
renderer.sharedMaterial = material;
|
||||
renderer.shadowCastingMode = ShadowCastingMode.Off;
|
||||
renderer.receiveShadows = false;
|
||||
renderer.motionVectorGenerationMode = MotionVectorGenerationMode.ForceNoMotion;
|
||||
renderer.enabled = visible;
|
||||
|
||||
return renderer;
|
||||
}
|
||||
|
||||
private Material CreateTrailMaterial(string materialName, bool additive)
|
||||
{
|
||||
Shader shader = Shader.Find("Sprites/Default");
|
||||
if (shader == null)
|
||||
{
|
||||
shader = Shader.Find("Unlit/Transparent");
|
||||
}
|
||||
|
||||
Material material = new Material(shader)
|
||||
{
|
||||
name = materialName,
|
||||
hideFlags = HideFlags.DontSave,
|
||||
renderQueue = (int)RenderQueue.Transparent
|
||||
};
|
||||
|
||||
if (material.HasProperty("_SrcBlend"))
|
||||
{
|
||||
material.SetInt("_SrcBlend", additive ? (int)BlendMode.SrcAlpha : (int)BlendMode.SrcAlpha);
|
||||
}
|
||||
|
||||
if (material.HasProperty("_DstBlend"))
|
||||
{
|
||||
material.SetInt("_DstBlend", additive ? (int)BlendMode.One : (int)BlendMode.OneMinusSrcAlpha);
|
||||
}
|
||||
|
||||
if (material.HasProperty("_ZWrite"))
|
||||
{
|
||||
material.SetInt("_ZWrite", 0);
|
||||
}
|
||||
|
||||
return material;
|
||||
}
|
||||
|
||||
private void ApplyMaterialColor(Material material, Color color, float alpha)
|
||||
{
|
||||
if (material == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Color materialColor = WithAlpha(color, alpha);
|
||||
if (material.HasProperty("_Color"))
|
||||
{
|
||||
material.SetColor("_Color", materialColor);
|
||||
}
|
||||
}
|
||||
|
||||
private void Clear()
|
||||
{
|
||||
samples.Clear();
|
||||
|
||||
if (wideMesh != null)
|
||||
{
|
||||
wideMesh.Clear();
|
||||
}
|
||||
|
||||
if (coreMesh != null)
|
||||
{
|
||||
coreMesh.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
private void RemoveLegacyTrailRenderers()
|
||||
{
|
||||
TrailRenderer[] legacyTrails = GetComponentsInChildren<TrailRenderer>(true);
|
||||
for (int i = legacyTrails.Length - 1; i >= 0; i--)
|
||||
{
|
||||
DestroyRuntimeObject(legacyTrails[i]);
|
||||
}
|
||||
}
|
||||
|
||||
private static Transform FindChildRecursive(Transform root, string childName)
|
||||
{
|
||||
if (root == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (root.name == childName)
|
||||
{
|
||||
return root;
|
||||
}
|
||||
|
||||
for (int i = 0; i < root.childCount; i++)
|
||||
{
|
||||
Transform found = FindChildRecursive(root.GetChild(i), childName);
|
||||
if (found != null)
|
||||
{
|
||||
return found;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static Color NormalizeColor(Color color)
|
||||
{
|
||||
float max = Mathf.Max(color.r, color.g, color.b);
|
||||
if (max > 1f)
|
||||
{
|
||||
color.r /= max;
|
||||
color.g /= max;
|
||||
color.b /= max;
|
||||
}
|
||||
|
||||
color.a = 1f;
|
||||
return color;
|
||||
}
|
||||
|
||||
private static Color WithAlpha(Color color, float alpha)
|
||||
{
|
||||
color.a = Mathf.Clamp01(alpha);
|
||||
return color;
|
||||
}
|
||||
|
||||
private static void DestroyRuntimeObject(Object target)
|
||||
{
|
||||
if (target == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (Application.isPlaying)
|
||||
{
|
||||
Destroy(target);
|
||||
}
|
||||
else
|
||||
{
|
||||
DestroyImmediate(target);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0f4ab89ec5474db497559af138ed0a6f
|
||||
@@ -0,0 +1,140 @@
|
||||
using System.Collections;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
|
||||
namespace VRBeats
|
||||
{
|
||||
public class SliceTrailEffect : MonoBehaviour
|
||||
{
|
||||
private const float Lifetime = 0.24f;
|
||||
private const int PointCount = 7;
|
||||
|
||||
private LineRenderer glowLine = null;
|
||||
private LineRenderer coreLine = null;
|
||||
private Vector3 center = Vector3.zero;
|
||||
private Vector3 tangent = Vector3.right;
|
||||
private Vector3 lift = Vector3.up;
|
||||
private Color effectColor = Color.cyan;
|
||||
|
||||
public static void Spawn(Vector3 position, Vector3 hitDir, Vector3 saberUp, Color color)
|
||||
{
|
||||
GameObject effectObject = new GameObject("SliceTrailEffect");
|
||||
SliceTrailEffect effect = effectObject.AddComponent<SliceTrailEffect>();
|
||||
effect.Construct(position, hitDir, saberUp, color);
|
||||
}
|
||||
|
||||
private void Construct(Vector3 position, Vector3 hitDir, Vector3 saberUp, Color color)
|
||||
{
|
||||
center = position;
|
||||
transform.position = position;
|
||||
effectColor = NormalizeColor(color);
|
||||
|
||||
tangent = saberUp.sqrMagnitude > 0.001f ? saberUp.normalized : Vector3.right;
|
||||
lift = hitDir.sqrMagnitude > 0.001f ? hitDir.normalized : Vector3.up;
|
||||
|
||||
glowLine = CreateLine("Glow", 0.16f, 0.45f);
|
||||
coreLine = CreateLine("Core", 0.045f, 0.95f);
|
||||
StartCoroutine(Animate());
|
||||
}
|
||||
|
||||
private LineRenderer CreateLine(string name, float width, float alpha)
|
||||
{
|
||||
GameObject lineObject = new GameObject(name);
|
||||
lineObject.transform.SetParent(transform, false);
|
||||
|
||||
LineRenderer line = lineObject.AddComponent<LineRenderer>();
|
||||
line.positionCount = PointCount;
|
||||
line.useWorldSpace = true;
|
||||
line.alignment = LineAlignment.View;
|
||||
line.textureMode = LineTextureMode.Stretch;
|
||||
line.numCornerVertices = 8;
|
||||
line.numCapVertices = 8;
|
||||
line.shadowCastingMode = ShadowCastingMode.Off;
|
||||
line.receiveShadows = false;
|
||||
line.material = CreateMaterial();
|
||||
line.widthMultiplier = width;
|
||||
ApplyGradient(line, alpha);
|
||||
return line;
|
||||
}
|
||||
|
||||
private IEnumerator Animate()
|
||||
{
|
||||
float age = 0.0f;
|
||||
while (age < Lifetime)
|
||||
{
|
||||
float t = age / Lifetime;
|
||||
float length = Mathf.Lerp(0.72f, 1.45f, t);
|
||||
float bend = Mathf.Lerp(0.12f, 0.34f, t);
|
||||
float alpha = 1.0f - t;
|
||||
|
||||
UpdateLine(glowLine, length, bend, alpha * 0.45f);
|
||||
UpdateLine(coreLine, length * 0.88f, bend * 0.55f, alpha * 0.95f);
|
||||
|
||||
age += Time.deltaTime;
|
||||
yield return null;
|
||||
}
|
||||
|
||||
Destroy(gameObject);
|
||||
}
|
||||
|
||||
private void UpdateLine(LineRenderer line, float length, float bend, float alpha)
|
||||
{
|
||||
if (line == null)
|
||||
return;
|
||||
|
||||
for (int i = 0; i < PointCount; i++)
|
||||
{
|
||||
float normalized = PointCount <= 1 ? 0.0f : (float)i / (PointCount - 1);
|
||||
float offset = normalized - 0.5f;
|
||||
float curve = Mathf.Sin(normalized * Mathf.PI) * bend;
|
||||
line.SetPosition(i, center + tangent * (offset * length) + lift * curve);
|
||||
}
|
||||
|
||||
ApplyGradient(line, alpha);
|
||||
}
|
||||
|
||||
private static Material CreateMaterial()
|
||||
{
|
||||
Shader shader = Shader.Find("Sprites/Default");
|
||||
if (shader == null)
|
||||
shader = Shader.Find("Unlit/Transparent");
|
||||
|
||||
Material material = new Material(shader);
|
||||
material.name = "Runtime Slice Trail";
|
||||
return material;
|
||||
}
|
||||
|
||||
private void ApplyGradient(LineRenderer line, float alpha)
|
||||
{
|
||||
Color start = new Color(effectColor.r, effectColor.g, effectColor.b, 0.0f);
|
||||
Color mid = new Color(effectColor.r, effectColor.g, effectColor.b, alpha);
|
||||
Color end = new Color(effectColor.r, effectColor.g, effectColor.b, 0.0f);
|
||||
|
||||
Gradient gradient = new Gradient();
|
||||
gradient.SetKeys(
|
||||
new[]
|
||||
{
|
||||
new GradientColorKey(start, 0.0f),
|
||||
new GradientColorKey(mid, 0.5f),
|
||||
new GradientColorKey(end, 1.0f),
|
||||
},
|
||||
new[]
|
||||
{
|
||||
new GradientAlphaKey(0.0f, 0.0f),
|
||||
new GradientAlphaKey(alpha, 0.5f),
|
||||
new GradientAlphaKey(0.0f, 1.0f),
|
||||
});
|
||||
line.colorGradient = gradient;
|
||||
}
|
||||
|
||||
private static Color NormalizeColor(Color color)
|
||||
{
|
||||
float max = Mathf.Max(color.r, Mathf.Max(color.g, color.b));
|
||||
if (max > 1.0f)
|
||||
color /= max;
|
||||
|
||||
color.a = 1.0f;
|
||||
return color;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 41e40f1c9d0c48af9e2ad90cb8c5108c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -56,10 +56,12 @@ namespace VRBeats
|
||||
//notify to whoever is listening that the player did a correct/incorrect slice
|
||||
if ( IsCutIntentValid(info as BeatDamageInfo) )
|
||||
{
|
||||
ScoreManager.ReportSliceTiming(GetTimingErrorSeconds());
|
||||
onCorrectSlice.Invoke();
|
||||
}
|
||||
else
|
||||
{
|
||||
ScoreManager.ReportMiss();
|
||||
onIncorrectSlice.Invoke();
|
||||
}
|
||||
|
||||
@@ -98,6 +100,7 @@ namespace VRBeats
|
||||
|
||||
public void Kill()
|
||||
{
|
||||
ScoreManager.ReportMiss();
|
||||
onPlayerMiss.Invoke();
|
||||
canBeKilled = false;
|
||||
transform.ScaleTween(Vector3.zero, 2.0f).SetEase(Ease.EaseOutExpo).SetOnComplete( delegate
|
||||
@@ -107,6 +110,13 @@ namespace VRBeats
|
||||
} );
|
||||
}
|
||||
|
||||
private float GetTimingErrorSeconds()
|
||||
{
|
||||
float speed = Mathf.Max(Mathf.Abs(thisSpawneable.Speed), 0.001f);
|
||||
float distanceFromPlayer = Mathf.Abs(transform.position.z - player.position.z);
|
||||
return distanceFromPlayer / speed;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using UnityEngine;
|
||||
using Platinio;
|
||||
using UnityEngine.Playables;
|
||||
using UnityEngine.SceneManagement;
|
||||
using VRBeats.ScriptableEvents;
|
||||
using VRSDK;
|
||||
|
||||
@@ -60,24 +62,22 @@ namespace VRBeats
|
||||
Vector3 finalPosition = CalculateSpawnPosition( info.position);
|
||||
Vector3 travelOffset = Vector3.forward * -settings.TargetTravelDistance;
|
||||
Vector3 spawnPosition = finalPosition - travelOffset;
|
||||
|
||||
Spawneable clone = Instantiate( spawneable , spawnPosition , Quaternion.Euler( info.rotation ) );
|
||||
SetSpeedRelativeToPlayZone(info);
|
||||
clone.Construct(info);
|
||||
|
||||
Vector3 finalScale = clone.transform.localScale;
|
||||
clone.transform.localScale = Vector3.zero;
|
||||
|
||||
float travelTime = info.travelTimeOverride > 0f ? info.travelTimeOverride : settings.TargetTravelTime;
|
||||
|
||||
clone.transform.Move(finalPosition, travelTime).SetEase(settings.TargetTravelEase).SetOnComplete(delegate
|
||||
{
|
||||
info.speed = settings.TargetTravelDistance / Mathf.Max(0.05f, travelTime);
|
||||
SetSpeedRelativeToPlayZone(info);
|
||||
|
||||
Spawneable clone = Instantiate( spawneable , spawnPosition , Quaternion.Euler( info.rotation ) );
|
||||
clone.Construct(info);
|
||||
StartCoroutine(BeginContinuousSpawnNextFrame(clone));
|
||||
}
|
||||
|
||||
private IEnumerator BeginContinuousSpawnNextFrame(Spawneable clone)
|
||||
{
|
||||
yield return null;
|
||||
|
||||
if (clone != null)
|
||||
clone.OnSpawn();
|
||||
}).SetUpdateMode(Platinio.TweenEngine.UpdateMode.Update);
|
||||
|
||||
|
||||
clone.transform.ScaleTween(finalScale, travelTime).SetEase(settings.TargetTravelEase);
|
||||
|
||||
}
|
||||
|
||||
private void SetSpeedRelativeToPlayZone(SpawnEventInfo info)
|
||||
@@ -122,13 +122,7 @@ namespace VRBeats
|
||||
|
||||
public void RestartLevel()
|
||||
{
|
||||
gameObject.CancelAllTweens();
|
||||
|
||||
isGameRunning = true;
|
||||
audioManager.SetAudioMixerPitch(1.0f);
|
||||
enviromentController.TurnLightsOn();
|
||||
playableDirector.time = 0.0f;
|
||||
playableDirector.Play();
|
||||
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -39,9 +39,9 @@ namespace VRBeats
|
||||
public void EnableXRRayInteractorComponents()
|
||||
{
|
||||
if (rayInteractor != null)
|
||||
rayInteractor.enabled = true;
|
||||
rayInteractor.enabled = false;
|
||||
if (interactorLineVisual != null)
|
||||
interactorLineVisual.enabled = true;
|
||||
interactorLineVisual.enabled = false;
|
||||
if (lineRender != null)
|
||||
lineRender.enabled = true;
|
||||
|
||||
|
||||
@@ -15,10 +15,14 @@ namespace VRBeats
|
||||
private VR_Grabbable grabbable = null;
|
||||
private ColorSide colorSide = ColorSide.Left;
|
||||
private MeshRenderer[] renderArray = null;
|
||||
private SaberTrailEffect trailEffect = null;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
renderArray = transform.GetComponentsInChildren<MeshRenderer>();
|
||||
trailEffect = GetComponent<SaberTrailEffect>();
|
||||
if (trailEffect == null)
|
||||
trailEffect = gameObject.AddComponent<SaberTrailEffect>();
|
||||
|
||||
grabbable = GetComponent<VR_Grabbable>();
|
||||
grabbable.OnGrabStateChange.AddListener(OnGrabStateChange);
|
||||
@@ -44,6 +48,9 @@ namespace VRBeats
|
||||
{
|
||||
SetMaterialBindings(materialBindingArray[n], c);
|
||||
}
|
||||
|
||||
if (trailEffect != null)
|
||||
trailEffect.SetColor(c);
|
||||
}
|
||||
|
||||
private void SetMaterialBindings(MaterialBindings matBindings, Color c)
|
||||
@@ -55,11 +62,15 @@ namespace VRBeats
|
||||
public void MakeVisible()
|
||||
{
|
||||
SetRenderArrayEnableValue(true);
|
||||
if (trailEffect != null)
|
||||
trailEffect.SetVisible(true);
|
||||
}
|
||||
|
||||
public void MakeInvisible()
|
||||
{
|
||||
SetRenderArrayEnableValue(false);
|
||||
if (trailEffect != null)
|
||||
trailEffect.SetVisible(false);
|
||||
}
|
||||
|
||||
private void SetRenderArrayEnableValue(bool value)
|
||||
@@ -72,4 +83,4 @@ namespace VRBeats
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user