Air Rally Fixes (#252)

* fix clouds

* add hit effects

fix jank with shuttle movement

* make near miss effect snap to player hit position

* add easing to forthington movement

* try different shuttle rotation method

* Revert "try different shuttle rotation method"

This reverts commit 96c0d56fd6f3fe57be2aeabdd24e85c728da3097.

* try other rotation method
This commit is contained in:
minenice55 2023-02-01 01:02:59 -05:00 committed by GitHub
parent 0f7c413fbd
commit 81d2e3af68
8 changed files with 7161 additions and 2399 deletions

File diff suppressed because it is too large Load diff

View file

@ -83,6 +83,12 @@ TextureImporter:
- first: - first:
213: -1969074579828895637 213: -1969074579828895637
second: Fort_Left_Arm second: Fort_Left_Arm
- first:
213: 8759155364766697816
second: AirRally_1_27
- first:
213: 4088167666801983468
second: AirRally_1_28
externalObjects: {} externalObjects: {}
serializedVersion: 11 serializedVersion: 11
mipmaps: mipmaps:
@ -537,7 +543,7 @@ TextureImporter:
width: 404 width: 404
height: 404 height: 404
alignment: 0 alignment: 0
pivot: {x: 0, y: 0} pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0} border: {x: 0, y: 0, z: 0, w: 0}
outline: [] outline: []
physicsShape: [] physicsShape: []
@ -558,7 +564,7 @@ TextureImporter:
width: 404 width: 404
height: 404 height: 404
alignment: 0 alignment: 0
pivot: {x: 0, y: 0} pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0} border: {x: 0, y: 0, z: 0, w: 0}
outline: [] outline: []
physicsShape: [] physicsShape: []
@ -579,7 +585,7 @@ TextureImporter:
width: 340 width: 340
height: 596 height: 596
alignment: 0 alignment: 0
pivot: {x: 0, y: 0} pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0} border: {x: 0, y: 0, z: 0, w: 0}
outline: [] outline: []
physicsShape: [] physicsShape: []
@ -600,7 +606,7 @@ TextureImporter:
width: 276 width: 276
height: 308 height: 308
alignment: 0 alignment: 0
pivot: {x: 0, y: 0} pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0} border: {x: 0, y: 0, z: 0, w: 0}
outline: [] outline: []
physicsShape: [] physicsShape: []
@ -621,7 +627,7 @@ TextureImporter:
width: 340 width: 340
height: 340 height: 340
alignment: 0 alignment: 0
pivot: {x: 0, y: 0} pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0} border: {x: 0, y: 0, z: 0, w: 0}
outline: [] outline: []
physicsShape: [] physicsShape: []
@ -642,7 +648,7 @@ TextureImporter:
width: 340 width: 340
height: 340 height: 340
alignment: 0 alignment: 0
pivot: {x: 0, y: 0} pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0} border: {x: 0, y: 0, z: 0, w: 0}
outline: [] outline: []
physicsShape: [] physicsShape: []
@ -663,7 +669,7 @@ TextureImporter:
width: 404 width: 404
height: 340 height: 340
alignment: 0 alignment: 0
pivot: {x: 0, y: 0} pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0} border: {x: 0, y: 0, z: 0, w: 0}
outline: [] outline: []
physicsShape: [] physicsShape: []
@ -684,7 +690,7 @@ TextureImporter:
width: 276 width: 276
height: 276 height: 276
alignment: 0 alignment: 0
pivot: {x: 0, y: 0} pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0} border: {x: 0, y: 0, z: 0, w: 0}
outline: [] outline: []
physicsShape: [] physicsShape: []
@ -705,7 +711,7 @@ TextureImporter:
width: 276 width: 276
height: 308 height: 308
alignment: 0 alignment: 0
pivot: {x: 0, y: 0} pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0} border: {x: 0, y: 0, z: 0, w: 0}
outline: [] outline: []
physicsShape: [] physicsShape: []
@ -726,7 +732,7 @@ TextureImporter:
width: 276 width: 276
height: 276 height: 276
alignment: 0 alignment: 0
pivot: {x: 0, y: 0} pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0} border: {x: 0, y: 0, z: 0, w: 0}
outline: [] outline: []
physicsShape: [] physicsShape: []
@ -738,6 +744,48 @@ TextureImporter:
indices: indices:
edges: [] edges: []
weights: [] weights: []
- serializedVersion: 2
name: AirRally_1_27
rect:
serializedVersion: 2
x: 743
y: 7
width: 722
height: 754
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
outline: []
physicsShape: []
tessellationDetail: 0
bones: []
spriteID: 85940617565ce8970800000000000000
internalID: 8759155364766697816
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: AirRally_1_28
rect:
serializedVersion: 2
x: 3239
y: 3751
width: 338
height: 338
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
outline: []
physicsShape: []
tessellationDetail: 0
bones: []
spriteID: cef38f935d61cb830800000000000000
internalID: 4088167666801983468
vertices: []
indices:
edges: []
weights: []
outline: [] outline: []
physicsShape: [] physicsShape: []
bones: [] bones: []

View file

@ -40,7 +40,7 @@ namespace HeavenStudio.Games.Loaders
}, },
new GameAction("ba bum bum bum", "Ba Bum Bum Bum") new GameAction("ba bum bum bum", "Ba Bum Bum Bum")
{ {
function = delegate { AirRally.instance.SetDistance(e.currentEntity["type"]); AirRally.instance.BaBumBumBum(e.currentEntity.beat, e.currentEntity["toggle"], e.currentEntity["type"]); }, function = delegate { AirRally.instance.BaBumBumBum(e.currentEntity.beat, e.currentEntity["toggle"], e.currentEntity["type"]); },
defaultLength = 7f, defaultLength = 7f,
parameters = new List<Param>() parameters = new List<Param>()
{ {
@ -93,13 +93,6 @@ namespace HeavenStudio.Games
[Header("Waypoint")] [Header("Waypoint")]
public float wayPointZForForth; public float wayPointZForForth;
[Header("Curves")]
public BezierCurve3D closeRallyCurve;
public BezierCurve3D farRallyCurve;
public BezierCurve3D fartherRallyCurve;
public BezierCurve3D farthestRallyCurve;
public BezierCurve3D closeRallyReturnCurve;
[Header("Debug")] [Header("Debug")]
public float beatShown; public float beatShown;
public float lengthHolder; public float lengthHolder;
@ -143,12 +136,8 @@ namespace HeavenStudio.Games
if(lengthHolder != lengthShown) if(lengthHolder != lengthShown)
{ {
started = true; started = true;
//convert to 2 decimal places
var f = currentBeat; var f = currentBeat;
//f = Mathf.Round(f * 10.0f) * 0.1f;
Rally(serveBeat + (int)f, wantSilent, lengthHolder); Rally(serveBeat + (int)f, wantSilent, lengthHolder);
//Debug.Log("Beat Loop: " + serveBeat + f);
//Debug.Log("Serve Beat: " + serveBeat);
} }
} }
} }
@ -185,6 +174,8 @@ namespace HeavenStudio.Games
shuttleScript.flyType = type; shuttleScript.flyType = type;
shuttleActive = true; shuttleActive = true;
Forthington.GetComponent<Animator>().Play("Hit");
} }
public void ReturnObject(float beat, float targetBeat, bool type) public void ReturnObject(float beat, float targetBeat, bool type)
@ -307,7 +298,7 @@ namespace HeavenStudio.Games
} }
else else
{ {
tweenForForth = Forthington.gameObject.transform.DOMoveZ(wayPointZForForth, .15f); tweenForForth = Forthington.gameObject.transform.DOMoveZ(wayPointZForForth, .15f).SetEase(Ease.InOutCubic);
} }
} }
@ -330,8 +321,6 @@ namespace HeavenStudio.Games
BeatAction.New(gameObject, new List<BeatAction.Action>() BeatAction.New(gameObject, new List<BeatAction.Action>()
{ {
//new BeatAction.Action(beat, delegate { Forthington.GetComponent<Animator>().Play("Ready");} ),
new BeatAction.Action(beat, delegate { Forthington.GetComponent<Animator>().Play("Hit");} ),
new BeatAction.Action(beat, delegate { ServeObject(beat, beat + 1, false); } ), new BeatAction.Action(beat, delegate { ServeObject(beat, beat + 1, false); } ),
}); });
@ -476,13 +465,13 @@ namespace HeavenStudio.Games
BeatAction.New(gameObject, new List<BeatAction.Action>() BeatAction.New(gameObject, new List<BeatAction.Action>()
{ {
new BeatAction.Action(beat + 0.5f, delegate { SetDistance(type, false); }),
new BeatAction.Action(beat + 1.5f, delegate { Forthington.GetComponent<Animator>().Play("Ready"); }), new BeatAction.Action(beat + 1.5f, delegate { Forthington.GetComponent<Animator>().Play("Ready"); }),
new BeatAction.Action(beat + 2.5f, delegate { if(babum) { Forthington.GetComponent<Animator>().Play("Hit"); } }),
new BeatAction.Action(beat + 2.5f, delegate { ServeObject(beat + 2.5f, beat + 4.5f, true); } ), new BeatAction.Action(beat + 2.5f, delegate { ServeObject(beat + 2.5f, beat + 4.5f, true); } ),
new BeatAction.Action(beat + 3.5f, delegate { Forthington.GetComponent<Animator>().Play("TalkShort"); }), new BeatAction.Action(beat + 3.5f, delegate { Forthington.GetComponent<Animator>().Play("TalkShort"); }),
new BeatAction.Action(beat + 4f, delegate { if(!count) Forthington.GetComponent<Animator>().Play("TalkShort"); }), new BeatAction.Action(beat + 4f, delegate { if(!count) Forthington.GetComponent<Animator>().Play("TalkShort"); }),
new BeatAction.Action(beat + 4.5f, delegate { Forthington.GetComponent<Animator>().Play("Ready"); }), new BeatAction.Action(beat + 4.5f, delegate { Forthington.GetComponent<Animator>().Play("Ready"); }),
new BeatAction.Action(beat + 7f, delegate { if(babum) { babum = false; } }), new BeatAction.Action(beat + 5.5f, delegate { if(babum) { babum = false; } }),
}); });
MultiSound.Play(new MultiSound.Sound[] { MultiSound.Play(new MultiSound.Sound[] {
@ -527,6 +516,7 @@ namespace HeavenStudio.Games
{ {
ReturnObject(Conductor.instance.songPositionInBeats, caller.startBeat + caller.timer + 1f, false); ReturnObject(Conductor.instance.songPositionInBeats, caller.startBeat + caller.timer + 1f, false);
hasMissed = false; hasMissed = false;
ActiveShuttle.GetComponent<Shuttlecock>().DoHit(e_BaBumState);
if (e_BaBumState == DistanceSound.close) if (e_BaBumState == DistanceSound.close)
{ {
@ -562,6 +552,7 @@ namespace HeavenStudio.Games
{ {
ReturnObject(Conductor.instance.songPositionInBeats, caller.startBeat + caller.timer + 2f, true); ReturnObject(Conductor.instance.songPositionInBeats, caller.startBeat + caller.timer + 2f, true);
hasMissed = false; hasMissed = false;
ActiveShuttle.GetComponent<Shuttlecock>().DoHit(e_BaBumState);
if (e_BaBumState == DistanceSound.close) if (e_BaBumState == DistanceSound.close)
{ {

View file

@ -0,0 +1,71 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace HeavenStudio.Games.Scripts_AirRally
{
public class Cloud : MonoBehaviour
{
[SerializeField] Sprite[] sprites;
[SerializeField] Vector3 spawnRange;
[SerializeField] float baseSpeed = 1f;
[SerializeField] float fadeDist = 10f;
[SerializeField] float lifeTime = 6f;
[SerializeField] float fadeInTime = 0.25f;
Camera cam;
SpriteRenderer spriteRenderer;
float time = 0f;
public bool isWorking = false;
public void Init()
{
cam = GameCamera.GetCamera();
spriteRenderer = GetComponent<SpriteRenderer>();
spriteRenderer.color = new Color(1, 1, 1, 0);
}
// Update is called once per frame
void Update()
{
time += Time.deltaTime;
transform.position += Vector3.forward * -baseSpeed * Time.deltaTime;
// get distance to camera
float dist = Vector3.Distance(cam.transform.position, transform.position);
if (dist <= fadeDist)
{
spriteRenderer.color = new Color(1, 1, 1, Mathf.Clamp01(dist / fadeDist));
}
else if (time < fadeInTime)
{
spriteRenderer.color = new Color(1, 1, 1, Mathf.Clamp01(time/fadeInTime));
}
if (time > lifeTime)
{
isWorking = false;
gameObject.SetActive(false);
spriteRenderer.color = new Color(1, 1, 1, 0);
}
}
public void StartCloud(Vector3 origin, bool prebake)
{
isWorking = true;
time = 0f;
gameObject.SetActive(true);
spriteRenderer.sprite = sprites[Random.Range(0, sprites.Length)];
transform.position = origin;
transform.position += new Vector3(Random.Range(-spawnRange.x, spawnRange.x), Random.Range(-spawnRange.y, spawnRange.y), Random.Range(-spawnRange.z, spawnRange.z));
if (prebake)
{
time = Random.Range(0, lifeTime);
transform.position += Vector3.forward * -baseSpeed * time;
float dist = Vector3.Distance(cam.transform.position, transform.position);
spriteRenderer.color = new Color(1, 1, 1, Mathf.Clamp01(dist / fadeDist));
}
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 891c0b37d3276da4fa7ea5ba3332dc13
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,65 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace HeavenStudio.Games.Scripts_AirRally
{
public class CloudsManager : MonoBehaviour
{
[SerializeField] Transform cloudRoot;
[SerializeField] GameObject cloudPrefab;
[SerializeField] int maxCloudAmt = 32;
[SerializeField] int cloudsToPreBake = 10;
[SerializeField] float cloudRepeatRate = 0.1f;
Cloud[] pool;
float time = 0f;
float lastTime = 0f;
// Start is called before the first frame update
void Start()
{
pool = new Cloud[maxCloudAmt];
for (int i = 0; i < maxCloudAmt; i++)
{
GameObject cloudObj = Instantiate(cloudPrefab, cloudRoot);
cloudObj.SetActive(false);
pool[i] = cloudObj.GetComponent<Cloud>();
pool[i].Init();
}
for (int i = 0; i < cloudsToPreBake; i++)
{
Cloud cloud = GetAvailableCloud();
if (cloud != null)
{
cloud.StartCloud(cloudRoot.position, true);
}
}
}
Cloud GetAvailableCloud()
{
foreach (Cloud cloud in pool)
{
if (!cloud.isWorking)
{
return cloud;
}
}
return null;
}
// Update is called once per frame
void Update()
{
time += Time.deltaTime;
if (time - lastTime > cloudRepeatRate)
{
lastTime = time;
GetAvailableCloud()?.StartCloud(cloudRoot.position, false);
}
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f9a1426575a6edb4b8f43668daac9f21
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -13,6 +13,7 @@ namespace HeavenStudio.Games.Scripts_AirRally
[SerializeField] Transform OtherTarget; [SerializeField] Transform OtherTarget;
[SerializeField] float TargetHeight; [SerializeField] float TargetHeight;
[SerializeField] float TargetHeightLong; [SerializeField] float TargetHeightLong;
[SerializeField] ParticleSystem hitEffect;
public float startBeat; public float startBeat;
public float flyBeats; public float flyBeats;
@ -30,21 +31,20 @@ namespace HeavenStudio.Games.Scripts_AirRally
void Start() void Start()
{ {
transform.position = OtherTarget.position;
} }
// Update is called once per frame // Update is called once per frame
void Update() void Update()
{ {
var cond = Conductor.instance; var cond = Conductor.instance;
Vector3 startPos = isReturning ? PlayerTarget.position : OtherTarget.position;
Vector3 endPos = isReturning ? OtherTarget.position : PlayerTarget.position;
Vector3 lastPos = transform.position; Vector3 lastPos = transform.position;
if (!GetComponent<Rigidbody2D>().simulated) if (!GetComponent<Rigidbody2D>().simulated)
{ {
float flyPos = cond.GetPositionFromBeat(startBeat, flyBeats); flyPos = cond.GetPositionFromBeat(startBeat, flyBeats);
Vector3 startPos = isReturning ? PlayerTarget.position : OtherTarget.position;
Vector3 endPos = isReturning ? OtherTarget.position : PlayerTarget.position;
transform.position = Vector3.LerpUnclamped(startPos, endPos, flyPos); transform.position = Vector3.LerpUnclamped(startPos, endPos, flyPos);
@ -53,11 +53,26 @@ namespace HeavenStudio.Games.Scripts_AirRally
transform.position += Vector3.up * yWeight * (flyType ? TargetHeightLong : TargetHeight); transform.position += Vector3.up * yWeight * (flyType ? TargetHeightLong : TargetHeight);
} }
Vector3 direction = (transform.position - lastPos).normalized; // calculates next position
float rotation = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg; {
this.transform.eulerAngles = new Vector3(0, 0, rotation - 90f); float rotation;
if (flyPos > 0.5)
{
Vector3 midPos = Vector3.LerpUnclamped(startPos, endPos, 0.5f);
midPos += Vector3.up * (flyType ? TargetHeightLong : TargetHeight);
Vector3 direction = (transform.position - midPos).normalized;
rotation = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
}
else
{
Vector3 direction = (transform.position - lastPos).normalized;
rotation = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
}
if (miss && flyPos > 2f) this.transform.eulerAngles = new Vector3(0, 0, rotation - 90f);
}
if (miss && flyPos > 4f)
{ {
if (cond.GetPositionFromBeat(startBeat, flyBeats + 1f) >= 1f) if (cond.GetPositionFromBeat(startBeat, flyBeats + 1f) >= 1f)
{ {
@ -67,16 +82,38 @@ namespace HeavenStudio.Games.Scripts_AirRally
} }
} }
public void DoHit(AirRally.DistanceSound distance)
{
ParticleSystem.MainModule main = hitEffect.main;
switch (distance)
{
case AirRally.DistanceSound.close:
main.startSize = 2f;
break;
case AirRally.DistanceSound.far:
main.startSize = 3f;
break;
case AirRally.DistanceSound.farther:
main.startSize = 4f;
break;
case AirRally.DistanceSound.farthest:
main.startSize = 6f;
break;
}
hitEffect.Play();
}
public void DoNearMiss() public void DoNearMiss()
{ {
miss = true; miss = true;
Jukebox.PlayOneShot("miss"); Jukebox.PlayOneShot("miss");
transform.position = PlayerTarget.position;
Rigidbody2D rb = GetComponent<Rigidbody2D>(); Rigidbody2D rb = GetComponent<Rigidbody2D>();
rb.simulated = true; rb.simulated = true;
rb.WakeUp(); rb.WakeUp();
rb.velocity = Vector3.zero; rb.velocity = Vector3.zero;
rb.gravityScale = 10f; rb.gravityScale = 10f;
rb.AddForce(Vector2.up * 10, ForceMode2D.Impulse); rb.AddForce(Vector2.up * 20, ForceMode2D.Impulse);
rb.AddForce(Vector2.right * -10, ForceMode2D.Impulse); rb.AddForce(Vector2.right * -10, ForceMode2D.Impulse);
} }