229 lines
4.8 KiB
C#
Raw Normal View History

2025-05-18 01:04:31 +08:00
// ***********************************************************************
// Assembly : Game
// Author : Kimch
// Created : 2020-09-02
// Description :
// Last Modified By :
// Last Modified On :
// ***********************************************************************
// <copyright file= "Ef_swing1" company="Kimch"></copyright>
// <summary></summary>
// ***********************************************************************
using UnityEngine;
namespace G
{
/// <summary>
/// 挥光
/// </summary>
public class Ef_swing1 : MonoBehaviour
{
public Transform pt_hit;
public Material[] attribute_mat = new Material[5];
private int _uvAnimationTileX;
private int _uvAnimationTileY;
private Vector2 _size;
private Vector2 _offset;
private int _index;
private int _lastIndex = -1;
private int _framesPerSecond = 20;
private int _lastFrame;
private int _impactFrame = 1;
private float _startTime;
private float _delay;
private int _originLayer = GameLayer.NormalAttack;
private int _layerIndex;
private bool _layerChange;
private bool _efon;
private bool _pton;
private int _random;
private int _addForce;
private Renderer _renderer;
private Collider _collider;
private EntityPlayer _scriptCha;
private Pt_hit _scriptHit;
private void Awake()
{
_renderer = this.GetComponentInChildren<Renderer>();
_collider = this.GetComponent<Collider>();
_originLayer = this.gameObject.layer;
}
private void Start()
{
var rootGO = this.transform.root.gameObject;
_scriptHit = pt_hit.GetComponent<Pt_hit>();
_scriptCha = rootGO.GetComponent<EntityMainPlayer>();
Physics.IgnoreCollision(rootGO.GetComponent<Collider>(), _collider);
_startTime = 0f;
_delay = 0f;
_renderer.enabled = false;
_collider.isTrigger = true;
_collider.enabled = false;
this.gameObject.SetActive(false);
}
public void SwingOn(float delay, int cnt_x, int cnt_y, int uvSpeed, int impact, int addForce)
{
this.gameObject.layer = _originLayer;
this.gameObject.SetActive(true);
_delay = delay;
_efon = true;
_uvAnimationTileX = cnt_x;
_uvAnimationTileY = cnt_y;
_lastFrame = _uvAnimationTileX * _uvAnimationTileY;
_framesPerSecond = uvSpeed;
_impactFrame = impact;
_addForce = addForce;
_size = new Vector2(1f / _uvAnimationTileX, 1f / _uvAnimationTileY);
if (_layerChange)
{
if (_random > GlobalUtils.RndHundred)
{
this.gameObject.layer = _layerIndex;
}
}
}
public void SwingOff()
{
this.gameObject.SetActive(false);
_renderer.enabled = false;
_collider.enabled = false;
_efon = false;
_pton = false;
_index = 0;
_lastIndex = -1;
_startTime = 0f;
}
public void RndEfOn(int index, int amount)
{
_random = amount;
//switch (amount)
//{
// case 2:
// _random = 5;
// break;
// case 3:
// _random = 10;
// break;
// case 4:
// _random = 20;
// break;
//}
//_random = 100;
switch (index)
{
case 0:
_layerIndex = GameLayer.NormalAttack;
_layerChange = false;
break;
case 1:
_layerIndex = GameLayer.BurnAttack;
_layerChange = true;
break;
case 2:
_layerIndex = GameLayer.ColdAttack;
_layerChange = true;
break;
case 3:
_layerIndex = GameLayer.ShockAttack;
_layerChange = true;
break;
case 4:
_layerIndex = GameLayer.DarkAttack;
_layerChange = true;
break;
}
}
public void ChangeAttribute(int index, int amount)
{
if (attribute_mat != null && index < attribute_mat.Length)
_renderer.material = attribute_mat[index];
RndEfOn(index, amount);
}
private void Update()
{
if (_efon)
{
if (_delay > 0f)
{
_delay -= Time.deltaTime;
}
else
{
if (_addForce > 0)
{
_scriptCha.AddForwardForce(_addForce);
}
_efon = false;
_startTime = 0f;
_renderer.enabled = true;
_scriptCha.SwingStart();
}
}
if (!_renderer.enabled)
{
return;
}
_startTime += Time.deltaTime;
_index = (int)(_startTime * _framesPerSecond);
if (_index == _lastIndex)
{
return;
}
if (_index >= _lastFrame)
{
_renderer.enabled = false;
this.gameObject.SetActive(false);
_collider.enabled = false;
_pton = false;
_lastIndex = -1;
}
else if (_index == _impactFrame || _index == _impactFrame + 1)
{
_collider.enabled = true;
if (!_pton)
{
_scriptHit.ParticleOn();
_pton = true;
}
}
else
{
_collider.enabled = false;
}
int _uIndex = _index % _uvAnimationTileX;
int _vIndex = _index / _uvAnimationTileX;
_offset = Vector2.right * _uIndex * _size.x + Vector2.up * (1f - _size.y - _vIndex * _size.y);
_renderer.material.mainTextureOffset = _offset;
_renderer.material.mainTextureScale = _size;
_lastIndex = _index;
}
}
}