// *********************************************************************** // Assembly : Game // Author : Kimch // Created : 2020-09-02 // Description : // Last Modified By : // Last Modified On : // *********************************************************************** // // // *********************************************************************** namespace G { using UnityEngine; /// /// 幽灵剑 /// public class SkillSpiritSword : MonoBehaviour { public Transform sword; protected Transform _transform; protected Collider _collider; protected Transform _cha1; protected Transform _oldTarget; protected int _swordIndex; protected float _startDelay; protected int _createIndex; protected bool _createFinish; protected bool _homing = true; protected float _power; protected float _liftTime; protected int _swordCount; protected int _hitCount; protected int _hitCountMax; public float lifeTime { set { _liftTime = value; } } public int swordCount { get { return _swordCount; } set { _swordCount = value; } } public int maxHitCount { set { _hitCountMax = value; } } public float power { set { _power = value; } } const int MAX_SWORD_COUNT = 7; #region Field private Transform[] _swords = new Transform[MAX_SWORD_COUNT]; #endregion #region Unity private void Awake() { _transform = this.transform; _collider = this.GetComponent(); _cha1 = GameObject.FindWithTag("Player").transform; } private void OnEnable() { Reset(); } public void Reset() { _collider.enabled = false; _startDelay = 0f; _createIndex = 0; _swordIndex = 0; _createFinish = false; _homing = false; _hitCount = 0; } private void OnTriggerEnter(Collider other) { if (other.gameObject.layer == GameLayer.UnitLayer && !_homing && (_oldTarget != other.transform)) { _swords[_swordIndex].GetComponent().FireSword(other.transform); _oldTarget = other.transform; _swordIndex++; _collider.enabled = false; _startDelay = 0f; _homing = true; if (_swordIndex >= _swordCount) { this.gameObject.SetActive(false); _transform.position = Vector3.up * 31f; } } } private void Update() { if (!_createFinish) { if (_startDelay > 0.1f) { _startDelay = 0f; if (_swords[_createIndex] == null) { Vector3 position = _transform.position; float angle = 30 * _createIndex; Vector3 eulerAngles = _transform.eulerAngles; _swords[_createIndex] = Object.Instantiate(sword, position, Quaternion.Euler(0f, angle + eulerAngles.y - 270f, 0f)); _swords[_createIndex].GetComponent().mass = _power; _swords[_createIndex].position += _swords[_createIndex].forward * 0.1f; _swords[_createIndex].forward = Vector3.up + _transform.forward * 0.6f; } else { _swords[_createIndex].GetComponent().mass = _power; _swords[_createIndex].position = _transform.position; float angle = 30 * _createIndex; Vector3 eulerAngles = _transform.eulerAngles; _swords[_createIndex].rotation = Quaternion.Euler(0f, angle + eulerAngles.y - 270f, 0f); _swords[_createIndex].gameObject.SetActive(true); _swords[_createIndex].position += _swords[_createIndex].forward * 0.1f; _swords[_createIndex].forward = Vector3.up + _transform.forward * 0.6f; } _swords[_createIndex].parent = _transform; if (++_createIndex >= _swordCount) { _createFinish = true; } } else { _startDelay += Time.deltaTime; } } else if (_startDelay > 0.4f) { _homing = false; _collider.enabled = true; _startDelay = -1f; } else if (_startDelay > -1f) { _startDelay += Time.deltaTime; } else { _startDelay -= Time.deltaTime; if (_startDelay < -2f) { _collider.enabled = false; _collider.enabled = true; _oldTarget = null; } } _transform.position = _cha1.position + Vector3.up * 0.2f; _transform.rotation = Quaternion.Lerp(_transform.rotation, _cha1.rotation, Time.deltaTime * 3f); } #endregion } }