pulse enemy graphics in time with music

This commit is contained in:
Cat Flynn 2021-01-09 17:29:48 +00:00
parent 8040a999be
commit e4fcf297b6
12 changed files with 132 additions and 26 deletions

View File

@ -12,7 +12,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: c271cfa846431634db54fa41238b7b35, type: 3}
m_Name: Accessibility Options
m_EditorClassIdentifier:
_mode: 0
_mode: 2
_calm:
_tunnel: {fileID: 2100000, guid: 735a92a62479ffd458216009452fec2b, type: 2}
_vibe:

View File

@ -12,9 +12,11 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: a918b83cb0f52b445bf4975f41eaf321, type: 3}
m_Name: Audio Visualiser
m_EditorClassIdentifier:
_distanceToNextBeat: {fileID: 11400000, guid: 8f05f93192443bc42b8523048bde0dc4, type: 2}
_distanceSinceLastBeat: {fileID: 11400000, guid: 8d22f3ed946820445adcc586d2cc6e5a, type: 2}
_fractalAnimations:
- name: _Fractality
multiplier: 43
multiplier: 100
channel: 0
sample: 525
_tunnelAnimations:

View File

@ -0,0 +1,16 @@
%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: 11500000, guid: d86361ffc5ae478d9e976629c5d651bd, type: 3}
m_Name: DistanceSinceLastBeat
m_EditorClassIdentifier:
_initialValue: 0
_readOnly: 0

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8d22f3ed946820445adcc586d2cc6e5a
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,16 @@
%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: 11500000, guid: d86361ffc5ae478d9e976629c5d651bd, type: 3}
m_Name: DistanceToNextBeat
m_EditorClassIdentifier:
_initialValue: 0
_readOnly: 0

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8f05f93192443bc42b8523048bde0dc4
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -100,6 +100,7 @@ Material:
- _Metallic: 0
- _OcclusionStrength: 1
- _Parallax: 0.005
- _PulseIntensity: 0.5
- _QueueOffset: 0
- _ReceiveShadows: 1
- _Smoothness: 0.5
@ -107,13 +108,14 @@ Material:
- _SpecularHighlights: 1
- _SrcBlend: 1
- _Surface: 0
- _VertexDistortion: 0.1
- _WorkflowMode: 1
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _Color1: {r: 0.06480328, g: 0, b: 0.06301003, a: 1}
- _Color2: {r: 0.4292453, g: 0.94931483, b: 1, a: 1}
- _Color1: {r: 0.7735849, g: 0.23718406, b: 0.58527553, a: 1}
- _Color2: {r: 0.9622642, g: 0.031772893, b: 0.041073136, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
m_BuildTextureStacks: []

View File

@ -117,7 +117,7 @@ Material:
- _FractalPower: 1
- _FractalRotateSpeed: 20
- _FractalScale: 6
- _FractalWeight: 0.45
- _FractalWeight: 0.15
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0

View File

@ -531,7 +531,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 3397488660842926093, guid: 1f82f952c53fc7449a0091cf29ba3def, type: 3}
propertyPath: m_LocalScale.x
value: 2282.9778
value: 2298.391
objectReference: {fileID: 0}
- target: {fileID: 3397488660842926093, guid: 1f82f952c53fc7449a0091cf29ba3def, type: 3}
propertyPath: m_LocalScale.y
@ -887,7 +887,13 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 30d54cd9cbc0b4024b4c5af11532f553, type: 3}
m_Name:
m_EditorClassIdentifier:
bpm: 180
_distanceToNextBeat: {fileID: 11400000, guid: 8f05f93192443bc42b8523048bde0dc4, type: 2}
_distanceToOffbeat: {fileID: 0}
_distanceToMeasure: {fileID: 0}
_distanceSinceLastBeat: {fileID: 11400000, guid: 8d22f3ed946820445adcc586d2cc6e5a, type: 2}
_distanceSinceOffbeat: {fileID: 0}
_distanceSinceMeasure: {fileID: 0}
bpm: 90
_onBeat:
m_PersistentCalls:
m_Calls:

View File

@ -4,12 +4,21 @@ using System.Collections.Generic;
using DG.Tweening;
using FMOD;
using FMODUnity;
using Ktyl.Util;
using UnityEngine;
using UnityEngine.Serialization;
using Debug = UnityEngine.Debug;
public class AudioBeatManager : MonoBehaviour, IAudioBeatManager
{
[SerializeField] private SerialFloat _distanceToNextBeat;
// [SerializeField] private SerialFloat _distanceToOffbeat;
// [SerializeField] private SerialFloat _distanceToMeasure;
[SerializeField] private SerialFloat _distanceSinceLastBeat;
// [SerializeField] private SerialFloat _distanceSinceOffbeat;
// [SerializeField] private SerialFloat _distanceSinceMeasure;
[SerializeField] private float bpm;
public float TimeBetweenBeats => _secPerBeat;
@ -36,25 +45,49 @@ public class AudioBeatManager : MonoBehaviour, IAudioBeatManager
{
_bps = bpm / 60f;
_secPerBeat = 60f / bpm;
_timer = 0;
RuntimeManager.CoreSystem.getMasterChannelGroup(out _channelGroup);
RuntimeManager.CoreSystem.getSoftwareFormat(out _sampleRate, out _, out _);
DOTween.SetTweensCapacity(2000,100);
}
// Update is called once per frame
private void Start()
{
_timer = 0;
}
void Update()
{
_channelGroup.getDSPClock(out _dspClock, out _);
_timer += Time.deltaTime;
if (_timer >= TimeBetweenBeats)
// _timer += Time.deltaTime;
// new beats
var beatsElapsed = (int)(DspTime / TimeBetweenBeats);
var lastBeatTime = beatsElapsed * TimeBetweenBeats;
var timeSinceLastBeat = DspTime - lastBeatTime;
_distanceSinceLastBeat.Value = timeSinceLastBeat / TimeBetweenBeats;
var timeToNextBeat = (lastBeatTime+TimeBetweenBeats) - DspTime;
_distanceToNextBeat.Value = timeToNextBeat / TimeBetweenBeats;
if (beatsElapsed > _currentBeat)
{
_timer = 0;
// a beat gone done did do happen
// account for this frame being a little bit past the beat!
_timer = timeSinceLastBeat;
++_currentBeat;
OnBeat?.Invoke(_currentBeat);
OnBeatEvent?.Invoke(_currentBeat);
}
}
private void UpdateTimings()
{
}
}
public interface IAudioBeatManager

View File

@ -1,6 +1,7 @@
using System;
using System.Runtime.InteropServices;
using FMOD;
using Ktyl.Util;
using UnityEngine;
using INITFLAGS = FMOD.Studio.INITFLAGS;
@ -20,9 +21,9 @@ public class AudioVisualizer : ScriptableObject
public float Initial { get; set; }
}
// private Material _fractal;
// private Material _tunnel;
// private Material _ship;
[SerializeField] private SerialFloat _distanceToNextBeat;
[SerializeField] private SerialFloat _distanceSinceLastBeat;
[SerializeField] private ShaderPropertyAnimation[] _fractalAnimations;
[SerializeField] private ShaderPropertyAnimation[] _tunnelAnimations;
[SerializeField] private ShaderPropertyAnimation[] _shipAnimations;
@ -51,6 +52,10 @@ public class AudioVisualizer : ScriptableObject
public void Update(DSP fft, Renderer fractal, Renderer tunnel, Renderer ship)
{
// update beat-based things
Shader.SetGlobalFloat("_DistanceSinceLastBeat", _distanceSinceLastBeat);
Shader.SetGlobalFloat("_DistanceToNextBeat", _distanceToNextBeat);
fft.getParameterData((int) FMOD.DSP_FFT.SPECTRUMDATA, out var unmanagedData, out var length);
var fftData = (FMOD.DSP_PARAMETER_FFT) Marshal.PtrToStructure(unmanagedData, typeof(FMOD.DSP_PARAMETER_FFT));

View File

@ -11,12 +11,12 @@ Shader "custom/enemy"
// [HDR] _Color2("Color 2", Color) = (1,1,1,1)
// _FadeStrength("Fade Strength", Float) = 0.1
// _VertexScale("Vertex Scale", Float) = 0
_PulseIntensity("Pulse Intensity", Float) = 1.0
_M("M", Float) = 0.5
_C("C", Float) = 0.0
_NoiseMap("Noise Map", 2D) = "black"
_VertexDistortion("Vertex Distortion", Float) = 1.0
}
SubShader
@ -55,9 +55,11 @@ Shader "custom/enemy"
float4 _Color1;
float4 _Color2;
float _Alpha;
float _TimeToNextBeat;
float _PulseIntensity;
float _DistanceToNextBeat;
float _DistanceFromLastBeat;
float _VertexDistortion;
// float _VertexScale;
// float _FadeStrength;
@ -81,22 +83,30 @@ Shader "custom/enemy"
Varyings OUT;
float3 vpos = IN.positionOS.xyz;
float3 wpos = TransformObjectToWorld(vpos);
OUT.wpos = wpos;
OUT.normal = IN.normal;
float d = 1.0+length(wpos)*0.5;
float2 uv = wpos.zx;
float noise = SAMPLE_TEXTURE2D_LOD(_NoiseMap, sampler_NoiseMap, uv, 0) - 0.5;
float beat = _DistanceToNextBeat*_DistanceToNextBeat;
vpos *= 1.0+beat*_PulseIntensity;
//float d = 1.0+length(wpos)*0.5;
//float2 uv = wpos.zx;
// float noise = SAMPLE_TEXTURE2D_LOD(_NoiseMap, sampler_NoiseMap, uv, 0) - 0.5;
// vpos += _VertexScale*float3(0,0,5)*d;
vpos += float3(_VertexDistortion,0,0)*noise*d;
// vpos += sin(180)*sin(1800)*float3(0,0,5)*d;
// noise *= d*d * 0.1;
// vpos *= lerp (0.9,1.1,noise);
float3 wpos = TransformObjectToWorld(vpos);
float3 fromCentre = normalize(wpos);
float3 distanceFromCentre = length(wpos);
float3 wposOffset = float3(0,0,fromCentre.y*fromCentre.x)*distanceFromCentre*beat;
wpos += wpos;
vpos += wposOffset;
OUT.wpos = wpos;
OUT.positionHCS = TransformObjectToHClip(vpos);
// The TRANSFORM_TEX macro performs the tiling and offset
// transformation.