123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- using System;
- using System.Collections.Generic;
- using GameWorld;
- using LitJson;
- using UnityEngine;
- public class BreakObjHurt : MonoBehaviour
- {
- private void Start()
- {
- this.sprite = base.GetComponent<SpriteRenderer>();
- this.currentHP = this.HP;
- this.brokenFlag = false;
- this.cc3 = Camera.main.GetComponent<CameraController>();
- this.pAttr = R.Player.Attribute;
- if (this.breakType == BreakObjHurt.BreakType.SpAttack)
- {
- JsonData jsonData = JsonMapper.ToObject(this.spAttackText.text);
- if (jsonData["spAttack"].IsArray)
- {
- for (int i = 0; i < jsonData["spAttack"].Count; i++)
- {
- this.spAttack.Add(jsonData["spAttack"][i].ToString());
- }
- }
- }
- }
- private void OnEnable()
- {
- EventManager.RegisterEvent<EnemyHurtAtkEventArgs>("EnemyHurtAtk", new EventManager.FBEventHandler<EnemyHurtAtkEventArgs>(this.Hurt), EventManager.ListenerQueue.Game);
- }
- private void OnDisable()
- {
- EventManager.UnregisterEvent<EnemyHurtAtkEventArgs>("EnemyHurtAtk", new EventManager.FBEventHandler<EnemyHurtAtkEventArgs>(this.Hurt), EventManager.ListenerQueue.Game);
- }
- private void Update()
- {
- if (this.currentHP <= this.breakHp && !this.breakFlag)
- {
- this.breakFlag = true;
- this.sprite.sprite = this.ChooseSprite(this.breakSprite);
- }
- if (this.currentHP <= 0 && !this.brokenFlag)
- {
- this.sprite.sprite = this.ChooseSprite(this.brokenSprite);
- this.brokenFlag = true;
- this.Break();
- }
- }
- private bool Hurt(string eventName, object sender, EnemyHurtAtkEventArgs msg)
- {
- if (msg.hurted != base.gameObject)
- {
- return false;
- }
- BreakObjHurt.BreakType breakType = this.breakType;
- if (breakType != BreakObjHurt.BreakType.HitTimes)
- {
- if (breakType == BreakObjHurt.BreakType.SpAttack)
- {
- this.SpAttackHurt(msg.attackData, msg.hurtPos);
- }
- }
- else
- {
- this.HitTimeHurt(msg.attackData, msg.hurtPos);
- }
- return true;
- }
- private void HitTimeHurt(EnemyHurtAtkEventArgs.PlayerNormalAtkData atkData, Vector3 pos)
- {
- this.currentHP--;
- Vector3 pos2 = pos - base.transform.position;
- this.HitEffect(pos2);
- this.TimeFrozenAndCameraShake(atkData.frozenFrame, atkData.shakeType, atkData.camShakeFrame, atkData.shakeStrength);
- }
- private void SpAttackHurt(EnemyHurtAtkEventArgs.PlayerNormalAtkData atkData, Vector3 pos)
- {
- if (this.AvailableAttack(atkData.atkName))
- {
- this.HitTimeHurt(atkData, pos);
- }
- }
- private bool AvailableAttack(string atkName)
- {
- foreach (string b in this.spAttack)
- {
- if (atkName == b)
- {
- return true;
- }
- }
- return false;
- }
- private void Break()
- {
- this.hurtBox.enabled = false;
- }
- private Sprite ChooseSprite(Sprite[] sprite)
- {
- if (sprite.Length <= 0)
- {
- return null;
- }
- int num = UnityEngine.Random.Range(0, sprite.Length);
- return sprite[num];
- }
- protected void TimeFrozenAndCameraShake(int frozenFrame, int shakeType, int shakeFrame, float shakeOffset)
- {
- SingletonMono<WorldTime>.Instance.TimeFrozenByFixedFrame(frozenFrame, WorldTime.FrozenArgs.FrozenType.All, true);
- if (shakeType != 0)
- {
- if (shakeType != 1)
- {
- if (shakeType == 2)
- {
- this.cc3.CameraShake((float)shakeFrame / 60f, shakeOffset, CameraController.ShakeTypeEnum.Vertical, false);
- }
- }
- else
- {
- this.cc3.CameraShake((float)shakeFrame / 60f, shakeOffset, CameraController.ShakeTypeEnum.Horizon, false);
- }
- }
- else
- {
- this.cc3.CameraShake((float)shakeFrame / 60f, shakeOffset, CameraController.ShakeTypeEnum.Rect, false);
- }
- }
- protected void HitEffect(Vector3 pos)
- {
- R.Effect.Generate(1, base.transform, pos, Vector3.zero, default(Vector3), true);
- R.Effect.Generate(71, base.transform, pos + Vector3.right * (float)this.pAttr.faceDir * 0.5f, new Vector3(0f, (float)((this.pAttr.faceDir <= 0) ? 0 : 180), UnityEngine.Random.Range(-90f, 0f)), default(Vector3), true);
- R.Effect.Generate(151, base.transform, pos, Vector3.zero, default(Vector3), true);
- }
- [Header("破坏条件")]
- public BreakObjHurt.BreakType breakType;
- [Header("总血量")]
- public int HP;
- private int currentHP;
- [Header("破坏条件为特殊攻击时,记录特殊攻击名称,仅在条件为SpAttack时有效")]
- public TextAsset spAttackText;
- private List<string> spAttack = new List<string>();
- public Collider2D hurtBox;
- private bool brokenFlag;
- private bool breakFlag;
- private CameraController cc3;
- private PlayerAttribute pAttr;
- private SpriteRenderer sprite;
- [Header("损坏血量")]
- public int breakHp;
- [Header("损坏图片")]
- public Sprite[] breakSprite;
- [Header("破坏图片")]
- public Sprite[] brokenSprite;
- public enum BreakType
- {
- HitTimes,
- SpAttack
- }
- }
|