// 구독한 이벤트 처리 public sealed override bool OnEvent(IEvent e) { if (e.GetType() == typeof(DamageEvent)) { DamageEvent DamageEvent = e as DamageEvent; if (DamageEvent.Target == (Unit)this) { GameManager.Instance.EffectSystem.CreateEffect("SwordImpactRed", this.gameObject.transform.position + new Vector3(-0.1f, 0.4f, 0), new Vector3(0.4f, 0.4f, 0.4f), Quaternion.Euler(new Vector3(-90, 0, 0)), 2); DamageEvent newDamageEvent = DamageEvent.Create(DamageEvent.Publisher, DamageEvent.Target, DamageEvent.Damage); HP -= newDamageEvent.Damage; if (HP <= 0) { currentState = MonsterUnitState.Dead; } } } else if (e.GetType() == typeof(PlayerUnitSummonEvent)) { PlayerUnitSummonEvent summonEvent = e as PlayerUnitSummonEvent; if (currentState == MonsterUnitState.Walk) { for (int i = 0; i < rangeTile.Count; i++) { if (summonEvent.SummonTilePos == UnitPosition + rangeTile[i]) { Target = summonEvent.SummonUnit; currentState = MonsterUnitState.Attack; } } } } return(false); }
protected void Walk(float dt) { monsterTransform.position = Vector3.MoveTowards(monsterTransform.position, pathList[0], dt * speed); // 거리가 특정 거리 이하 일때 발생 if (Vector3.Distance(monsterTransform.position, pathList[0]) <= 0.1) { currentState = MonsterUnitState.SetPath; } else if (Vector3.Distance(monsterTransform.position, pathList[0]) <= 0.5 && pathList[0] != UnitPosition) { // 절반정도 진입했으면 TileEnter, TileLeave발행하고 포함된 타일 변경 + 적이 있는지 체크 GameManager.Instance.MessageSystem.Publish(TileLeaveEvent.Create(UnitPosition, this)); UnitPosition = pathList[0]; GameManager.Instance.MessageSystem.Publish(TileEnterEvent.Create(UnitPosition, this)); if (CheckPlayerUnit()) { currentState = MonsterUnitState.Attack; } } }
protected void SetPath() { // 다음 노드로 이동 if (pathList.Count > 1) { pathList.RemoveAt(0); direction = ((Vector3)pathList[0] - UnitPosition).normalized; if (UnitPosition.x <= pathList[0].x) { spriteRenderer.flipX = true; } else { spriteRenderer.flipX = false; } currentState = MonsterUnitState.Walk; } else { Dispose(true); GameManager.Instance.MessageSystem.Publish(MonsterDeadEvent.Create(this, UnitPosition)); } }