This repository has been archived on 2024-11-03. You can view files and clone it, but cannot push or open issues or pull requests.
snakeinabox/Assets/Scripts/Render/Poof.cs
2020-12-06 23:47:43 -08:00

118 lines
No EOL
2.7 KiB
C#

using UnityEngine;
using NaughtyAttributes;
using System;
using Random = UnityEngine.Random;
public class Poof
{
public Poof(GraphXData data)
{
Game.OnEat += this.Eat;
this.data = data;
}
GraphXData data;
public class Pif
{
public bool inside;
public Vector3 zero, pos;
public float scale;
public Quaternion rot;
public Pif()
{
this.inside = false;
this.zero = Vector3.zero;
this.pos = Vector3.zero;
this.scale = 0;
this.rot = Quaternion.Euler(
Random.Range(0, 4) * 90,
Random.Range(0, 4) * 90,
Random.Range(0, 4) * 90
);
}
}
Pif[] pifs = new Pif[32];
Matrix4x4[] matrices = new Matrix4x4[32];
void Eat(Vector3 pos)
{
Burst(pos, 0.5f);
}
public void Burst(Vector3 pos, float range = 0.25f, float scale = 1f)
{
for (int i = 0; i < pifs.Length; i++)
{
if (Random.value > 0.7f)
{
pifs[i].zero = pos;
pifs[i].pos = pos + (new Vector3(
Random.Range(-1f, 1f),
Random.Range(-1f, 1f),
Random.Range(-1f, 1f)) * range
);
pifs[i].scale = Random.value * scale;
pifs[i].inside = true;
}
}
}
public void Splash(Vector3 pos, Vector3 spread, float scale = 0.1f)
{
for (int i = 0; i < pifs.Length; i++)
{
if (Random.value > 0.9f)
{
pifs[i].zero = pos;
pifs[i].pos = pos + new Vector3(
Random.Range(-spread.x, spread.x),
Random.Range(0, spread.y),
Random.Range(-spread.z, spread.z));
pifs[i].scale = Random.value * scale;
pifs[i].inside = false;
}
}
}
Vector3 oldFoodPos;
public void Run(Main main)
{
if (oldFoodPos != main.food)
{
Burst(main.food, 0.1f, 0.5f);
oldFoodPos = main.food;
}
for (int i = 0; i < pifs.Length; i++)
{
if (pifs[i] == null)
{
pifs[i] = new Pif();
}
pifs[i].scale = Mathf.Clamp01(pifs[i].scale - pifs[i].scale * Time.deltaTime / 1);
Vector3 toPos = pifs[i].pos + (pifs[i].pos - pifs[i].zero).normalized * 3 * pifs[i].scale * Time.deltaTime;
toPos += Vector3.down * 0.3f * pifs[i].scale * Time.deltaTime;
if (pifs[i].inside)
{
toPos.x = Mathf.Clamp(toPos.x, -main.design.bounds.x - 0.5f, main.design.bounds.x + 0.5f);
toPos.y = Mathf.Clamp(toPos.y, -main.design.bounds.y - 0.5f, main.design.bounds.y + 0.5f);
toPos.z = Mathf.Clamp(toPos.z, -main.design.bounds.z - 0.5f, main.design.bounds.z + 0.5f);
}
pifs[i].pos = toPos;
matrices[i].SetTRS(
pifs[i].pos,
pifs[i].rot,
pifs[i].scale * Vector3.one
);
}
Graphics.DrawMeshInstanced(data.poofMesh, 0, data.unlitMat, matrices);
}
}