187 lines
3.5 KiB
C#
187 lines
3.5 KiB
C#
using UnityEngine;
|
|
namespace G
|
|
{
|
|
public class Ani_meshUV : MonoBehaviour
|
|
{
|
|
private Mesh thismesh;
|
|
|
|
private Vector2[] tempUV = new Vector2[4];
|
|
|
|
private int uvAnimationTileX = 5;
|
|
|
|
private int uvAnimationTileY = 5;
|
|
|
|
private int framesPerSecond = 20;
|
|
|
|
private int index;
|
|
|
|
private int oldindex = -1;
|
|
|
|
private int impact = 18;
|
|
|
|
private float starttime;
|
|
|
|
private int length = 14;
|
|
|
|
private bool loop = true;
|
|
|
|
private bool dead;
|
|
|
|
private bool attack;
|
|
|
|
private bool damaged;
|
|
|
|
private bool visible;
|
|
|
|
private bool loopattack;
|
|
|
|
private Vector2 size;
|
|
|
|
private Vector2 offset;
|
|
|
|
private float uIndex;
|
|
|
|
private int vIndex;
|
|
|
|
private int startframe;
|
|
|
|
private Transform mytransform;
|
|
|
|
private Renderer myrenderer;
|
|
|
|
private Material mymaterial;
|
|
|
|
private Collider mycollider;
|
|
|
|
private void Awake()
|
|
{
|
|
thismesh = GetComponent<MeshFilter>().mesh;
|
|
starttime = 0f;
|
|
mytransform = base.transform;
|
|
mycollider = base.GetComponent<Collider>();
|
|
myrenderer = base.GetComponent<Renderer>();
|
|
size = new Vector2(1f / uvAnimationTileX, 1f / uvAnimationTileY);
|
|
}
|
|
|
|
public void Damaged(Vector3 _hitdir)
|
|
{
|
|
if (!damaged)
|
|
{
|
|
index = 0;
|
|
starttime = 0f;
|
|
startframe = 22;
|
|
length = 3;
|
|
loop = false;
|
|
damaged = true;
|
|
attack = false;
|
|
framesPerSecond = 10;
|
|
}
|
|
}
|
|
|
|
private void OnTriggerEnter(Collider other)
|
|
{
|
|
if (!damaged && !attack && other.gameObject.layer == G.GameLayer.UnitLayer)
|
|
{
|
|
index = 0;
|
|
starttime = 0f;
|
|
startframe = 14;
|
|
length = 9;
|
|
loop = false;
|
|
attack = true;
|
|
framesPerSecond = 12;
|
|
mycollider.enabled = false;
|
|
}
|
|
}
|
|
|
|
public void ColliderOn()
|
|
{
|
|
mycollider.enabled = true;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (dead)
|
|
{
|
|
return;
|
|
}
|
|
visible = myrenderer.isVisible;
|
|
if (!attack && !damaged)
|
|
{
|
|
Vector3 position = mytransform.position;
|
|
if (position.z < 9.4f)
|
|
{
|
|
mytransform.position += Vector3.forward * Time.deltaTime * 0.2f;
|
|
}
|
|
else if (!loopattack)
|
|
{
|
|
startframe = 14;
|
|
length = 9;
|
|
loop = false;
|
|
attack = true;
|
|
framesPerSecond = 12;
|
|
}
|
|
if (!visible)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
starttime += Time.deltaTime;
|
|
index = (int)(starttime * framesPerSecond);
|
|
if (loop)
|
|
{
|
|
index = index % length + startframe;
|
|
}
|
|
else
|
|
{
|
|
index += startframe;
|
|
}
|
|
uIndex = index % uvAnimationTileX;
|
|
vIndex = uvAnimationTileY - 1 - index / uvAnimationTileX;
|
|
if (index == oldindex)
|
|
{
|
|
return;
|
|
}
|
|
if (index >= startframe + length)
|
|
{
|
|
if (attack)
|
|
{
|
|
index = 0;
|
|
starttime = 0f;
|
|
startframe = 0;
|
|
oldindex = -1;
|
|
length = 14;
|
|
loop = true;
|
|
attack = false;
|
|
framesPerSecond = 20;
|
|
this.gameObject.layer = G.GameLayer.AllyLayer;
|
|
Invoke(nameof(ColliderOn), 0.5f);
|
|
}
|
|
else if (damaged)
|
|
{
|
|
index = startframe + length - 1;
|
|
dead = true;
|
|
Object.Destroy(this.gameObject, 2f);
|
|
}
|
|
mycollider.enabled = false;
|
|
uIndex = index % uvAnimationTileX;
|
|
vIndex = uvAnimationTileY - 1 - index / uvAnimationTileX;
|
|
}
|
|
if (index == impact)
|
|
{
|
|
mycollider.enabled = true;
|
|
this.gameObject.layer = G.GameLayer.CrowdAttack;
|
|
}
|
|
if (visible)
|
|
{
|
|
offset = Vector2.right * uIndex * size.x + Vector2.up * vIndex * size.y;
|
|
tempUV[2] = offset + Vector2.up * size.y;
|
|
tempUV[3] = offset + Vector2.up * size.y + Vector2.right * size.x;
|
|
tempUV[0] = offset;
|
|
tempUV[1] = offset + Vector2.right * size.x;
|
|
thismesh.uv = tempUV;
|
|
}
|
|
oldindex = index;
|
|
}
|
|
}
|
|
}
|