187 lines
3.5 KiB
C#
Raw Permalink Normal View History

2025-05-18 01:04:31 +08:00
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;
}
}
}