Rhythm Rally: Added "toss ball" action. Paddler now also tosses ball when you miss.

This commit is contained in:
Jenny Crowe 2022-02-21 23:43:24 -07:00
parent d9550afaec
commit e3863590fb
3 changed files with 286 additions and 17 deletions

View File

@ -492,6 +492,53 @@ SpriteRenderer:
m_WasSpriteAssigned: 1
m_MaskInteraction: 0
m_SpriteSortPoint: 0
--- !u!1 &1904528871620876249
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7123869637936811309}
- component: {fileID: 8077471796495908552}
m_Layer: 10
m_Name: Point 2
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &7123869637936811309
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1904528871620876249}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0.03, z: 2.079}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 9077140957458773248}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &8077471796495908552
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1904528871620876249}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b0cca3244f403c24f819a870f31cdc29, type: 3}
m_Name:
m_EditorClassIdentifier:
curve: {fileID: 10327036049174933}
handleType: 0
leftHandleLocalPosition: {x: 0, y: 0.4, z: 0}
rightHandleLocalPosition: {x: -0, y: -0.4, z: -0}
--- !u!1 &2034480636994138272
GameObject:
m_ObjectHideFlags: 0
@ -909,7 +956,7 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3667855830336901894}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -0.167, y: 0.03, z: 2.079}
m_LocalPosition: {x: 0, y: 0.03, z: 2.079}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 1845910055258765698}
@ -1082,7 +1129,7 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4262381482084858378}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.1246, y: 0, z: -2.0983}
m_LocalPosition: {x: 0, y: 0, z: -2.0983}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 1845910055258765698}
@ -1198,6 +1245,155 @@ MonoBehaviour:
handleType: 1
leftHandleLocalPosition: {x: 0, y: 0.55, z: 0.88}
rightHandleLocalPosition: {x: 0, y: 0.45, z: -0.4549628}
--- !u!1 &5476235103473015094
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3680569986833971144}
- component: {fileID: 4326544752565425689}
m_Layer: 10
m_Name: Point 1
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &3680569986833971144
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5476235103473015094}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0.425, z: 2.079}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 9077140957458773248}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &4326544752565425689
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5476235103473015094}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b0cca3244f403c24f819a870f31cdc29, type: 3}
m_Name:
m_EditorClassIdentifier:
curve: {fileID: 10327036049174933}
handleType: 0
leftHandleLocalPosition: {x: -0, y: -0, z: 0}
rightHandleLocalPosition: {x: 0, y: 0, z: -0}
--- !u!1 &5571437366825965275
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1512601611263843253}
- component: {fileID: 9099385795814476598}
m_Layer: 10
m_Name: Point 0
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1512601611263843253
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5571437366825965275}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0.03, z: 2.079}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 9077140957458773248}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &9099385795814476598
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5571437366825965275}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b0cca3244f403c24f819a870f31cdc29, type: 3}
m_Name:
m_EditorClassIdentifier:
curve: {fileID: 10327036049174933}
handleType: 0
leftHandleLocalPosition: {x: 0, y: -0.4, z: 0}
rightHandleLocalPosition: {x: -0, y: 0.4, z: -0}
--- !u!1 &6399112775887748606
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 9077140957458773248}
- component: {fileID: 10327036049174933}
m_Layer: 10
m_Name: TossCurve
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &9077140957458773248
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6399112775887748606}
m_LocalRotation: {x: -0, y: 0.029666247, z: -0, w: 0.9995599}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 1512601611263843253}
- {fileID: 3680569986833971144}
- {fileID: 7123869637936811309}
m_Father: {fileID: 227248172885675867}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 3.4, z: 0}
--- !u!114 &10327036049174933
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6399112775887748606}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 066a41e004f415b4eb74d5e61a2aadbe, type: 3}
m_Name:
m_EditorClassIdentifier:
curveColor: {r: 0, g: 1, b: 0, a: 1}
startPointColor: {r: 1, g: 0, b: 0, a: 1}
endPointColor: {r: 0, g: 0, b: 1, a: 1}
sampling: 25
keyPoints:
- {fileID: 9099385795814476598}
- {fileID: 4326544752565425689}
- {fileID: 8077471796495908552}
normalizedTime: 0.5
--- !u!1 &6878547494759724039
GameObject:
m_ObjectHideFlags: 0
@ -1222,7 +1418,7 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6878547494759724039}
m_LocalRotation: {x: 0, y: 1, z: 0, w: 0}
m_LocalRotation: {x: 0, y: 0.9995599, z: -0, w: -0.029666154}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
@ -1231,7 +1427,7 @@ Transform:
- {fileID: 2008423486364638542}
m_Father: {fileID: 227248172885675867}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0}
m_LocalEulerAnglesHint: {x: 0, y: 183.4, z: 0}
--- !u!114 &2715991891693212353
MonoBehaviour:
m_ObjectHideFlags: 0
@ -1442,7 +1638,7 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7366375554666111783}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.0433, y: 0.0281, z: -2.0833}
m_LocalPosition: {x: 0, y: 0.0281, z: -2.0833}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 2492954830728060394}
@ -1515,8 +1711,10 @@ MonoBehaviour:
cameraPos: {fileID: 6509993024069972873}
ball: {fileID: 1668061868608559892}
ballShadow: {fileID: 7207398029238753263}
ballTrail: {fileID: 4238313091838702597}
serveCurve: {fileID: 6371738825610660614}
returnCurve: {fileID: 2715991891693212353}
tossCurve: {fileID: 10327036049174933}
ballHitFX: {fileID: 8205255986357351166}
playerAnim: {fileID: 9089436218394572253}
opponentAnim: {fileID: 4559734961269837672}
@ -1524,8 +1722,11 @@ MonoBehaviour:
started: 0
missed: 0
served: 0
tossing: 0
serveBeat: 0
targetBeat: 0
tossBeat: 0
tossLength: 0
paddlers: {fileID: 2423225589381961324}
--- !u!1 &8205255986357351166
GameObject:
@ -1638,6 +1839,7 @@ Transform:
m_Children:
- {fileID: 1845910055258765698}
- {fileID: 2492954830728060394}
- {fileID: 9077140957458773248}
m_Father: {fileID: 4631944531018638297}
m_RootOrder: 4
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@ -1846,16 +2048,16 @@ PrefabInstance:
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: cebeb8610d89fb34688750080a285ddb, type: 3}
--- !u!1 &1065418898597387318 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: cebeb8610d89fb34688750080a285ddb, type: 3}
m_PrefabInstance: {fileID: 146447278275535207}
m_PrefabAsset: {fileID: 0}
--- !u!4 &397144130134918796 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: cebeb8610d89fb34688750080a285ddb, type: 3}
m_PrefabInstance: {fileID: 146447278275535207}
m_PrefabAsset: {fileID: 0}
--- !u!1 &1065418898597387318 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: cebeb8610d89fb34688750080a285ddb, type: 3}
m_PrefabInstance: {fileID: 146447278275535207}
m_PrefabAsset: {fileID: 0}
--- !u!95 &4559734961269837672
Animator:
serializedVersion: 3
@ -2500,9 +2702,9 @@ PrefabInstance:
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: cebeb8610d89fb34688750080a285ddb, type: 3}
--- !u!1 &7954728381481796141 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: cebeb8610d89fb34688750080a285ddb, type: 3}
--- !u!4 &7291063904195614871 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: cebeb8610d89fb34688750080a285ddb, type: 3}
m_PrefabInstance: {fileID: 7108288251017691004}
m_PrefabAsset: {fileID: 0}
--- !u!4 &2075964892847120759 stripped
@ -2510,9 +2712,9 @@ Transform:
m_CorrespondingSourceObject: {fileID: 9109367605909020171, guid: cebeb8610d89fb34688750080a285ddb, type: 3}
m_PrefabInstance: {fileID: 7108288251017691004}
m_PrefabAsset: {fileID: 0}
--- !u!4 &7291063904195614871 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: cebeb8610d89fb34688750080a285ddb, type: 3}
--- !u!1 &7954728381481796141 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: cebeb8610d89fb34688750080a285ddb, type: 3}
m_PrefabInstance: {fileID: 7108288251017691004}
m_PrefabAsset: {fileID: 0}
--- !u!95 &9089436218394572253

View File

@ -19,8 +19,10 @@ namespace RhythmHeavenMania.Games.RhythmRally
[Header("Ball and curve info")]
public GameObject ball;
public GameObject ballShadow;
public TrailRenderer ballTrail;
public BezierCurve3D serveCurve;
public BezierCurve3D returnCurve;
public BezierCurve3D tossCurve;
public GameObject ballHitFX;
@ -33,8 +35,11 @@ namespace RhythmHeavenMania.Games.RhythmRally
public bool started;
public bool missed;
public bool served;
public bool tossing;
public float serveBeat;
public float targetBeat;
public float tossBeat;
public float tossLength;
private bool inPose;
public Paddlers paddlers;
@ -152,6 +157,13 @@ namespace RhythmHeavenMania.Games.RhythmRally
curveToUse.transform.localScale = new Vector3(1f, curveHeight, 1f);
ball.transform.position = curveToUse.GetPoint(Mathf.Clamp(curvePosition, 0, 1));
}
else
{
if (tossing)
{
TossUpdate(tossBeat, tossLength);
}
}
// TODO: Make conditional so ball shadow only appears when over table.
ballShadow.transform.position = new Vector3(ball.transform.position.x, -0.399f, ball.transform.position.z);
@ -195,14 +207,34 @@ namespace RhythmHeavenMania.Games.RhythmRally
{
opponentPrepping = true;
if ((opponentState.IsName("Swing") && opponentAnim.IsAnimationNotPlaying()) || (!opponentState.IsName("Swing") && !opponentState.IsName("Ready1")))
{
opponentAnim.Play("Ready1");
// Toss ball if it fell off the table.
if (missed && !tossing)
{
float tossHeight = 3f;
if (rallySpeed == RallySpeed.Slow || rallySpeed == RallySpeed.Fast)
tossHeight = 6f;
Toss(hitBeat + beatDur1, beatDur2, tossHeight);
}
}
// If player never swung and is still in ready state, snap them out of it.
if (missed && playerState.IsName("Ready1"))
playerAnim.Play("Beat");
}
}
}
else
{
if (tossing)
{
TossUpdate(tossBeat, tossLength);
}
}
// Paddler bop animation.
@ -213,7 +245,7 @@ namespace RhythmHeavenMania.Games.RhythmRally
if (!playerPrepping && (playerAnim.IsAnimationNotPlaying() || playerState.IsName("Idle") || playerState.IsName("Beat")))
playerAnim.Play("Beat", 0, 0);
if (!opponentPrepping && !opponentServing && (opponentAnim.IsAnimationNotPlaying() || opponentState.IsName("Idle") || opponentState.IsName("Beat")))
if (!opponentPrepping && !opponentServing && !tossing && (opponentAnim.IsAnimationNotPlaying() || opponentState.IsName("Idle") || opponentState.IsName("Beat")))
opponentAnim.Play("Beat", 0, 0);
}
}
@ -233,6 +265,7 @@ namespace RhythmHeavenMania.Games.RhythmRally
missed = false;
started = true;
opponentServing = true;
tossing = false;
serveBeat = beat;
rallySpeed = speed;
@ -263,6 +296,39 @@ namespace RhythmHeavenMania.Games.RhythmRally
paddlers.ResetState();
}
public void Toss(float beat, float length, float height, bool firstToss = false)
{
tossCurve.transform.localScale = new Vector3(1f, height, 1f);
tossBeat = beat;
tossLength = length;
tossing = true;
if (firstToss)
{
opponentAnim.Play("Ready1");
Jukebox.PlayOneShotGame("rhythmRally/Whistle");
}
StartCoroutine(TossTrailCo());
}
// Hide the trail for one frame to avoid shenanigans when teleporting the ball.
IEnumerator TossTrailCo()
{
ballTrail.emitting = false;
TossUpdate(tossBeat, tossLength);
yield return null;
ballTrail.emitting = true;
}
private void TossUpdate(float beat, float duration)
{
var tossPosition = Conductor.instance.GetPositionFromBeat(beat, duration);
ball.transform.position = tossCurve.GetPoint(Mathf.Clamp(tossPosition, 0, 1));
}
public void Pose()
{
playerAnim.Play("Pose", 0, 0);

View File

@ -231,6 +231,7 @@ namespace RhythmHeavenMania
new Minigame("rhythmRally", "Rhythm Rally \n<color=#eb5454>[WIP don't use]</color>", "00e700", true, false, new List<GameAction>()
{
new GameAction("bop", delegate { RhythmRally.instance.Bop(eventCaller.currentEntity.beat, eventCaller.currentEntity.length); }, 0.5f, true),
new GameAction("toss ball", delegate { RhythmRally.instance.Toss(eventCaller.currentEntity.beat, eventCaller.currentEntity.length, 6f, true); }, 2f),
new GameAction("rally", delegate { RhythmRally.instance.Serve(eventCaller.currentEntity.beat, RhythmRally.RallySpeed.Normal); }, 4f, true),
new GameAction("slow rally", delegate { RhythmRally.instance.Serve(eventCaller.currentEntity.beat, RhythmRally.RallySpeed.Slow); }, 8f, true),
new GameAction("fast rally", delegate { RhythmRally.instance.PrepareFastRally(eventCaller.currentEntity.beat, RhythmRally.RallySpeed.Fast); }, 6f),