118 lines
No EOL
2.7 KiB
C#
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);
|
|
}
|
|
} |