Commit 328a22f5 authored by 15김민규's avatar 15김민규

Merge branch 'enemy'

# Conflicts:
#	Assets/Scenes/PlayScene.unity
#	Assets/Scripts/Characters/Enemy/EnemyAir.cs
#	Assets/Scripts/Characters/Enemy/EnemyGround.cs
parents 7d77c1cd 9d617db8
......@@ -163,7 +163,7 @@ AnimationClip:
m_GenerateMotionCurves: 0
m_Events:
- time: 0
functionName: ChangeVelocityX_noOption
functionName: ChangeVelocityX_movement
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
......
......@@ -71,4 +71,11 @@ AnimationClip:
m_HasGenericRootTransform: 0
m_HasMotionFloatCurves: 0
m_GenerateMotionCurves: 0
m_Events: []
m_Events:
- time: 0
functionName: ChangeDir_forAnimation
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
......@@ -109,7 +109,7 @@ AnimationClip:
m_GenerateMotionCurves: 0
m_Events:
- time: 0
functionName: ChangeVelocityX_noOption
functionName: ChangeVelocityX_movement
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
......
......@@ -65,4 +65,11 @@ AnimationClip:
m_HasGenericRootTransform: 0
m_HasMotionFloatCurves: 0
m_GenerateMotionCurves: 0
m_Events: []
m_Events:
- time: 0
functionName: ChangeDir_forAnimation
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
......@@ -61,7 +61,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
m_IsActive: 1
--- !u!1 &1734061800721222
GameObject:
m_ObjectHideFlags: 1
......@@ -157,7 +157,7 @@ Transform:
m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 1636491341446076}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -6.88, y: 1.405, z: 0}
m_LocalPosition: {x: 11.29, y: -17.94, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 4015301101001556}
......@@ -299,10 +299,11 @@ MonoBehaviour:
trackSpeed: 2.5
knockbackPercentage:
- 0.5
MovementLock: 0
bumped: 0
bumpable: 1
movementLock: 0
attackRange: 1.2
rotatable: 1
WallTest:
CliffTest:
--- !u!114 &114173716467154830
MonoBehaviour:
m_ObjectHideFlags: 1
......@@ -378,7 +379,7 @@ SpriteRenderer:
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: -2078941185
m_SortingLayer: 7
m_SortingLayer: 8
m_SortingOrder: 0
m_Sprite: {fileID: 21300000, guid: 71335108d30aa0e4a90179a09895440e, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
......
......@@ -21,7 +21,7 @@ GameObject:
- component: {fileID: 4804976410232030}
- component: {fileID: 50573848117970958}
- component: {fileID: 61188111102399610}
m_Layer: 16
m_Layer: 20
m_Name: Spider
m_TagString: Enemy
m_Icon: {fileID: 0}
......@@ -37,7 +37,7 @@ GameObject:
m_Component:
- component: {fileID: 4205286087293746}
- component: {fileID: 114337624805266014}
m_Layer: 0
m_Layer: 20
m_Name: HPBar
m_TagString: Untagged
m_Icon: {fileID: 0}
......@@ -55,7 +55,7 @@ GameObject:
- component: {fileID: 212993065858080250}
- component: {fileID: 95156341909549574}
- component: {fileID: 114803474034076246}
m_Layer: 0
m_Layer: 20
m_Name: Body
m_TagString: Untagged
m_Icon: {fileID: 0}
......@@ -72,7 +72,7 @@ GameObject:
- component: {fileID: 4370838883948786}
- component: {fileID: 61019308264186112}
- component: {fileID: 114106922099255344}
m_Layer: 18
m_Layer: 17
m_Name: Hitbox
m_TagString: Untagged
m_Icon: {fileID: 0}
......
......@@ -60,3 +60,9 @@ MonoBehaviour:
- {fileID: 1896221696921858, guid: 6051c7354232afa45bf71a1032a49418, type: 2}
EnemySpawnCount: 0
EnemyDeadCount: 0
layerMaskWall:
serializedVersion: 2
m_Bits: 256
layerMaskPlatform:
serializedVersion: 2
m_Bits: 2304
......@@ -637,6 +637,48 @@ Prefab:
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 7fec52078de87f74abe791494596a804, type: 2}
m_IsPrefabAsset: 0
--- !u!1001 &604778652
Prefab:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4639192263818050, guid: a164c147037e89448820f7387c724c42, type: 2}
propertyPath: m_LocalPosition.x
value: 11.29
objectReference: {fileID: 0}
- target: {fileID: 4639192263818050, guid: a164c147037e89448820f7387c724c42, type: 2}
propertyPath: m_LocalPosition.y
value: -17.94
objectReference: {fileID: 0}
- target: {fileID: 4639192263818050, guid: a164c147037e89448820f7387c724c42, type: 2}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4639192263818050, guid: a164c147037e89448820f7387c724c42, type: 2}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 4639192263818050, guid: a164c147037e89448820f7387c724c42, type: 2}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 4639192263818050, guid: a164c147037e89448820f7387c724c42, type: 2}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 4639192263818050, guid: a164c147037e89448820f7387c724c42, type: 2}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4639192263818050, guid: a164c147037e89448820f7387c724c42, type: 2}
propertyPath: m_RootOrder
value: 15
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: a164c147037e89448820f7387c724c42, type: 2}
m_IsPrefabAsset: 0
--- !u!1001 &650104063
Prefab:
m_ObjectHideFlags: 0
......@@ -681,6 +723,21 @@ Prefab:
propertyPath: comboUI
value:
objectReference: {fileID: 1504194384}
- target: {fileID: 114402380471012178, guid: 3d077a5f727dd1e4780e9265ed26e036,
type: 2}
propertyPath: enemyLayer.m_Bits
value: 1114112
objectReference: {fileID: 0}
- target: {fileID: 114402380471012178, guid: 3d077a5f727dd1e4780e9265ed26e036,
type: 2}
propertyPath: debuffTime2
value: 0
objectReference: {fileID: 0}
- target: {fileID: 114402380471012178, guid: 3d077a5f727dd1e4780e9265ed26e036,
type: 2}
propertyPath: debuffTime.Array.data[2]
value: 3
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 3d077a5f727dd1e4780e9265ed26e036, type: 2}
m_IsPrefabAsset: 0
......
......@@ -775,11 +775,6 @@ Prefab:
propertyPath: m_RootOrder
value: 17
objectReference: {fileID: 0}
- target: {fileID: 50573848117970958, guid: e4298313f9e94c44fb057542ec7ad273,
type: 2}
propertyPath: m_AngularDrag
value: 50
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: e4298313f9e94c44fb057542ec7ad273, type: 2}
m_IsPrefabAsset: 0
......
......@@ -46,7 +46,6 @@ public class AttackProperty : MonoBehaviour {
private void OnTriggerEnter2D(Collider2D collision)
{
Bounds tmpBounds = new Bounds();
if ((enemyLayer == (enemyLayer | 1 << collision.gameObject.layer)) && !collision.transform.GetChild(0).GetComponent<Enemy>().Invisible)
{
......@@ -63,7 +62,7 @@ public class AttackProperty : MonoBehaviour {
}
}
collision.transform.GetChild(0).GetComponent<Enemy>().GetDamaged(curAttack);
collision.transform.GetChild(0).GetComponent<Enemy>().GetHit(curAttack);
//make effect
foreach (Collider2D col in GetComponents<Collider2D>())
......
......@@ -22,10 +22,10 @@ public class ArcherIdle : StateMachineBehaviour
noticeRange = enemy.noticeRange;
patrolSpeed = enemy.patrolSpeed;
enemy.ChangeDir_noOption(NumeratedDir.Left);
enemy.ChangeDir_movement(NumeratedDir.Left);
if (patrolRange > 0)
{
enemy.ChangeVelocityX_noOption(enemy.MoveDir * patrolSpeed);
enemy.ChangeVelocityX_movement(enemy.MoveDir * patrolSpeed);
}
}
......@@ -37,7 +37,7 @@ public class ArcherIdle : StateMachineBehaviour
animator.SetTrigger("TrackTrigger");
return;
}
if (!enemy.MovementLock && patrolRange > 0)
if (patrolRange > 0)
{
float span = animatorRoot.position.x - origin.x;
......@@ -46,8 +46,8 @@ public class ArcherIdle : StateMachineBehaviour
enemy.CliffTest[(enemy.MoveDir + 1) / 2]
)
{
enemy.ChangeDir_noOption(enemy.MoveDir * -1);
enemy.ChangeVelocityX_noOption(enemy.MoveDir * patrolSpeed);
enemy.ChangeDir_movement(enemy.MoveDir * -1);
enemy.ChangeVelocityX_movement(enemy.MoveDir * patrolSpeed);
}
}
}
......
......@@ -35,14 +35,14 @@ public class ArcherTrack : StateMachineBehaviour
attackRange = enemy.attackRange;
NumeratedDir trackDir = (animatorRoot.position.x - player.transform.position.x > 0) ? NumeratedDir.Left : NumeratedDir.Right;
enemy.ChangeDir_noOption(trackDir);
enemy.ChangeDir_movement(trackDir);
if (enemy.CliffTest[(enemy.MoveDir + 1) / 2] || animator.GetComponent<Enemy>().PlayerDistance < attackRange)
{
enemy.ChangeVelocityX_noOption(0.0f);
enemy.ChangeVelocityX_movement(0.0f);
}
else
{
enemy.ChangeVelocityX_noOption(enemy.MoveDir * trackSpeed);
enemy.ChangeVelocityX_movement(enemy.MoveDir * trackSpeed);
}
}
......@@ -61,18 +61,18 @@ public class ArcherTrack : StateMachineBehaviour
int integerDir = enemy.MoveDir;
if (enemy.WallTest[(integerDir + 1) / 2] || enemy.CliffTest[(integerDir + 1) / 2])
{
enemy.ChangeVelocityX_noOption(0.0f);
enemy.ChangeVelocityX_movement(0.0f);
}
else
{
enemy.ChangeVelocityX_noOption(enemy.MoveDir * trackSpeed);
enemy.ChangeVelocityX_movement(enemy.MoveDir * trackSpeed);
}
frameCounter += 1;
if (frameCounter >= maxFrame)
{
NumeratedDir trackDir = (animatorRoot.position.x - player.transform.position.x > 0) ? NumeratedDir.Left : NumeratedDir.Right;
enemy.ChangeDir_noOption(trackDir);
enemy.ChangeDir_movement(trackDir);
frameCounter = 0;
}
}
......
......@@ -3,22 +3,13 @@ using System.Collections.Generic;
using UnityEngine;
public class EnemyAirIdle : StateMachineBehaviour {
float patrolRange;
float patrolSpeed;
float noticeRange;
Vector2 origin;
Transform animatorRoot;
EnemyAir enemy;
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
origin = animator.transform.position;
animatorRoot = animator.transform.parent;
enemy = animator.GetComponent<EnemyAir>();
patrolRange = enemy.patrolRange;
noticeRange = enemy.noticeRange;
patrolSpeed = enemy.patrolSpeed;
}
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
......
......@@ -4,23 +4,20 @@ using UnityEngine;
public class EnemyAirTrack : StateMachineBehaviour {
float trackSpeed;
float trackRange;
float angle;
GameObject player;
Transform animatorRoot;
EnemyAir enemy;
Vector2 direction;
private readonly float interpolateCoeff = 0.05f;
int maxFrame = 10;
int frameCount;
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
animatorRoot = animator.transform.parent;
enemy = animator.GetComponent<EnemyAir>();
player = GameManager.Instance.player;
trackSpeed = enemy.trackSpeed;
frameCount = 0;
direction = Vector2.up;
SetDirection();
}
......@@ -30,14 +27,14 @@ public class EnemyAirTrack : StateMachineBehaviour {
{
animator.ResetTrigger("TrackTrigger");
animator.SetTrigger("IdleTrigger");
enemy.ChangeVelocityXY_noOption(Vector2.zero);
enemy.ChangeVelocityXY_movement(Vector2.zero);
return;
}
SetDirection();
Vector2 vel = direction.normalized * trackSpeed;
enemy.ChangeVelocityXY_noOption(vel);
enemy.ChangeVelocityXY_movement(vel);
}
// OnStateExit is called when a transition ends and the state machine finishes evaluating this state
......@@ -57,8 +54,9 @@ public class EnemyAirTrack : StateMachineBehaviour {
private void SetDirection()
{
direction = player.transform.position - animatorRoot.position;
Vector2 directionToPlayer = (player.transform.position - animatorRoot.position).normalized;
direction = (directionToPlayer * interpolateCoeff + direction * (1 - interpolateCoeff)).normalized;
angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
enemy.ChangeAngleZ_noOption(angle - 90.0f);
enemy.ChangeAngleZ_movement(angle - 90.0f);
}
}
......@@ -20,9 +20,9 @@ public class EnemyMeleeIdle : StateMachineBehaviour {
noticeRange = enemy.noticeRange;
patrolSpeed = enemy.patrolSpeed;
enemy.ChangeDir_noOption(NumeratedDir.Left);
enemy.ChangeDir_movement(NumeratedDir.Left);
if (enemy.patrolRange > 0) {
enemy.ChangeVelocityX_noOption(enemy.MoveDir * patrolSpeed);
enemy.ChangeVelocityX_movement(enemy.MoveDir * patrolSpeed);
}
}
......@@ -33,7 +33,7 @@ public class EnemyMeleeIdle : StateMachineBehaviour {
animator.SetTrigger("TrackTrigger");
return;
}
if (!enemy.MovementLock && patrolRange > 0)
if (patrolRange > 0)
{
float span = animatorRoot.position.x - origin.x;
......@@ -42,8 +42,8 @@ public class EnemyMeleeIdle : StateMachineBehaviour {
enemy.CliffTest[(enemy.MoveDir + 1) / 2]
)
{
enemy.ChangeDir_noOption(enemy.MoveDir * -1);
enemy.ChangeVelocityX_noOption(enemy.MoveDir * patrolSpeed);
enemy.ChangeDir_movement(enemy.MoveDir * -1);
enemy.ChangeVelocityX_movement(enemy.MoveDir * patrolSpeed);
}
}
}
......
......@@ -22,14 +22,14 @@ public class EnemyMeleeTrack : StateMachineBehaviour {
attackRange = enemy.attackRange;
NumeratedDir trackDir = (animatorRoot.position.x - player.transform.position.x > 0) ? NumeratedDir.Left : NumeratedDir.Right;
enemy.ChangeDir_noOption(trackDir);
enemy.ChangeDir_movement(trackDir);
if (enemy.CliffTest[(enemy.MoveDir + 1) / 2] || animator.GetComponent<Enemy>().PlayerDistance < attackRange)
{
enemy.ChangeVelocityX_noOption(0.0f);
enemy.ChangeVelocityX_movement(0.0f);
}
else
{
enemy.ChangeVelocityX_noOption(enemy.MoveDir * trackSpeed);
enemy.ChangeVelocityX_movement(enemy.MoveDir * trackSpeed);
}
}
......@@ -43,18 +43,18 @@ public class EnemyMeleeTrack : StateMachineBehaviour {
int integerDir = enemy.MoveDir;
if (enemy.WallTest[(integerDir + 1) / 2] || enemy.CliffTest[(integerDir + 1) / 2])
{
enemy.ChangeVelocityX_noOption(0.0f);
enemy.ChangeVelocityX_movement(0.0f);
}
else
{
enemy.ChangeVelocityX_noOption(enemy.MoveDir * trackSpeed);
enemy.ChangeVelocityX_movement(enemy.MoveDir * trackSpeed);
}
frameCounter += 1;
if (frameCounter >= maxFrame)
{
NumeratedDir trackDir = (animatorRoot.position.x - player.transform.position.x > 0) ? NumeratedDir.Left : NumeratedDir.Right;
enemy.ChangeDir_noOption(trackDir);
enemy.ChangeDir_movement(trackDir);
frameCounter = 0;
}
}
......
......@@ -35,14 +35,14 @@ public class Jollarcher2Track : StateMachineBehaviour
attackRange = enemy.attackRange;
NumeratedDir trackDir = (animatorRoot.position.x - player.transform.position.x > 0) ? NumeratedDir.Left : NumeratedDir.Right;
enemy.ChangeDir_noOption(trackDir);
enemy.ChangeDir_movement(trackDir);
if (enemy.CliffTest[(enemy.MoveDir + 1) / 2] || animator.GetComponent<Enemy>().PlayerDistance < attackRange)
{
enemy.ChangeVelocityX_noOption(0.0f);
enemy.ChangeVelocityX_movement(0.0f);
}
else
{
enemy.ChangeVelocityX_noOption(enemy.MoveDir * trackSpeed);
enemy.ChangeVelocityX_movement(enemy.MoveDir * trackSpeed);
}
}
......@@ -62,18 +62,18 @@ public class Jollarcher2Track : StateMachineBehaviour
int integerDir = enemy.MoveDir;
if (enemy.WallTest[(integerDir + 1) / 2] || enemy.CliffTest[(integerDir + 1) / 2])
{
enemy.ChangeVelocityX_noOption(0.0f);
enemy.ChangeVelocityX_movement(0.0f);
}
else
{
enemy.ChangeVelocityX_noOption(enemy.MoveDir * trackSpeed);
enemy.ChangeVelocityX_movement(enemy.MoveDir * trackSpeed);
}
frameCounter += 1;
if (frameCounter >= maxFrame)
{
NumeratedDir trackDir = (animatorRoot.position.x - player.transform.position.x > 0) ? NumeratedDir.Left : NumeratedDir.Right;
enemy.ChangeDir_noOption(trackDir);
enemy.ChangeDir_movement(trackDir);
frameCounter = 0;
}
}
......
......@@ -17,20 +17,11 @@ public class DamageToPlayer : MonoBehaviour {
private void OnTriggerStay2D(Collider2D collision)
{
if (collision.CompareTag("Player") && isBumpAttack && transform.parent.gameObject.GetComponent<Enemy>().bumpable)
if (collision.CompareTag("Player") && isBumpAttack && !transform.parent.gameObject.GetComponent<EnemyAir>().bumped)
{
EnemyAttackInfo attack = new EnemyAttackInfo(damage, 1f, 0, null, null);
collision.gameObject.GetComponent<PlayerAttack>().TakeDamage(attack);
transform.parent.gameObject.GetComponent<EnemyAir>().bumped = true;
transform.parent.gameObject.GetComponent<EnemyAir>().bumpable = false;
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.CompareTag("Player") && isBumpAttack)
{
transform.parent.gameObject.GetComponent<Enemy>().bumped = false;
}
}
}
......@@ -27,7 +27,7 @@ public class Enemy : MonoBehaviour {
public float patrolSpeed;
public float trackSpeed;
public float[] knockbackPercentage;
public float currHealth { get; protected set; }
public float CurrHealth { get; protected set; }
// manager
protected InventoryManager inventoryManager;
......@@ -37,19 +37,14 @@ public class Enemy : MonoBehaviour {
// for movement
protected Animator animator;
protected float stunnedAnimLength;
public bool MovementLock;
public EnemyMovementLock movementLock;
public bool Invisible { get; protected set; }
public bool KnockbackLock { get; protected set; }
public float PlayerDistance { get; protected set; }
protected virtual IEnumerator Knockback(float knockbackDist, float knockbackTime) { yield return 0; }
// drop item
private int[] dropTable;
// for bumping attack
public bool bumped = false;
public bool bumpable = true;
// method
// Standard method
protected virtual void Awake()
......@@ -71,8 +66,9 @@ public class Enemy : MonoBehaviour {
protected virtual void Start()
{
currHealth = maxHealth;
Invisible = MovementLock = KnockbackLock = false;
CurrHealth = maxHealth;
Invisible = false;
movementLock = EnemyMovementLock.Free;
if (enemyManager.DropTableByID.ContainsKey(monsterID)) { dropTable = enemyManager.DropTableByID[monsterID]; }
PlayerDistance = Vector2.Distance(GameManager.Instance.player.transform.position, transform.parent.position);
}
......@@ -85,62 +81,41 @@ public class Enemy : MonoBehaviour {
// When damaged
// - Calculate value & Arrange information
public virtual void GetDamaged(PlayerAttackInfo attack)
{
if (Invisible) { return; }
float prevHealth = currHealth;
currHealth -= attack.damage;
if (currHealth <= 0)
public virtual void GetHit(PlayerAttackInfo attack)
{
Invisible = true;
animator.SetTrigger("DeadTrigger");
StopCoroutine("OnFire");
GetComponent<SpriteRenderer>().color = Color.white;
return;
}
DebuffApply(attack.debuffTime);
TakeDamage(attack.damage);
float knockbackDist = attack.damage * attack.knockBackMultiplier / weight;
float knockbackTime = (knockbackDist >= 0.5f) ? 0.5f : knockbackDist;
if (MovementLock) // 넉백이 진행 중
if (movementLock == EnemyMovementLock.Rigid) // 넉백이 진행 중
{
StopCoroutine("Knockback");
}
StartCoroutine(Knockback(knockbackDist, knockbackTime));
float currHealthPercentage = currHealth / maxHealth;
float prevHealthPercentage = prevHealth / maxHealth;
foreach (float percentage in knockbackPercentage)
{
if (currHealthPercentage > percentage) { break; }
if (prevHealthPercentage > percentage)
if (movementLock < EnemyMovementLock.Debuffed)
{
animator.SetTrigger("DamagedTrigger");
break;
}
movementLock = EnemyMovementLock.Rigid;
StartCoroutine(Knockback(knockbackDist, knockbackTime));
}
DebuffApply(attack.debuffTime);
animator.SetTrigger("TrackTrigger");
}
public void GetDamaged(float damage)
public void TakeDamage(float damage)
{
if (Invisible) { return; }
float prevHealth = currHealth;
currHealth -= damage;
if (currHealth <= 0)
float prevHealth = CurrHealth;
CurrHealth -= damage;
if (CurrHealth <= 0)
{
Invisible = true;
animator.SetTrigger("DeadTrigger");
StopCoroutine("OnFire");
GetComponent<SpriteRenderer>().color = Color.white;
MakeDead();
return;
}
float currHealthPercentage = currHealth / maxHealth;
float currHealthPercentage = CurrHealth / maxHealth;
float prevHealthPercentage = prevHealth / maxHealth;
foreach (float percentage in knockbackPercentage)
......@@ -154,6 +129,15 @@ public class Enemy : MonoBehaviour {
}
}
public void MakeDead()
{
Invisible = true;
animator.SetTrigger("DeadTrigger");
StopCoroutine("OnFire");
GetComponent<SpriteRenderer>().color = Color.white;
return;
}
// - Apply debuff
protected void DebuffApply(float[] debuffTime)
{
......@@ -180,11 +164,13 @@ public class Enemy : MonoBehaviour {
break;
case EnemyDebuffCase.Ice:
debuffState[debuff] = DebuffState.On;
movementLock = EnemyMovementLock.Debuffed;
StartCoroutine(OnIce(duration));
break;
case EnemyDebuffCase.Stun:
if(debuffState[debuff] != DebuffState.On) {
debuffState[debuff] = DebuffState.On;
movementLock = EnemyMovementLock.Debuffed;
StartCoroutine(OnStun(duration));
}
break;
......@@ -226,7 +212,7 @@ public class Enemy : MonoBehaviour {
foreach (Item item in inventoryManager.itemList)
damageMultiplier *= item.GlobalFireDamageMultiplier();
GetDamaged(lifeStoneManager.lifeStoneRowNum * 0.3f * damageMultiplier);
TakeDamage(lifeStoneManager.lifeStoneRowNum * 0.3f * damageMultiplier);
EffectManager.Instance.StartNumber(0, gameObject.transform.parent.position, lifeStoneManager.lifeStoneRowNum * 0.3f);
}
debuffState[(int)EnemyDebuffCase.Fire] = DebuffState.Off;
......@@ -248,12 +234,13 @@ public class Enemy : MonoBehaviour {
case EnemyDebuffCase.Ice:
GetComponent<SpriteRenderer>().color = Color.white;
StopCoroutine("OnIce");
KnockbackLock = false;
movementLock = EnemyMovementLock.Free;
animator.speed = 1.0f;
animator.SetTrigger("DisableStunTrigger");
break;
case EnemyDebuffCase.Stun:
StopCoroutine("OnStun");
movementLock = EnemyMovementLock.Free;
animator.speed = 1.0f;
animator.SetTrigger("DisableStunTrigger");
break;
......@@ -270,10 +257,11 @@ public class Enemy : MonoBehaviour {
if (transform.parent.GetComponentInChildren<HPBar>())
transform.parent.GetComponentInChildren<HPBar>().Inactivate();
transform.parent.gameObject.SetActive(false);
transform.parent.SetParent(null);
StopAllCoroutines();
enemyManager.EnemyDeadCount++; // 다른 enemy로 인해 소환되는 enemy가 추가될 경우 여기를 건드려야 함
enemyManager.EnemyDeadCount++;
currHealth = maxHealth;
CurrHealth = maxHealth;
Invisible = false;
// Drop 아이템 결정. 인덱스 별 아이템은 맨 밑에 서술
if (dropTable == null) { return; }
......
......@@ -3,103 +3,99 @@ using System.Collections.Generic;
using UnityEngine;
public class EnemyAir : Enemy {
// for bumping attack
public bool bumped = false;
public bool prevBumped = false;
protected override void Start()
{
base.Start();
StartCoroutine(BumpCheck());
prevBumped = bumped;
}
protected override void FixedUpdate()
{
base.FixedUpdate();
if (bumpable)
{
MovementLock = false;
}
else
if(prevBumped != bumped && bumped && movementLock == EnemyMovementLock.Free)
{
ChangeVelocityXY_zero();
MovementLock = true;
StartCoroutine(Knockback(0.0f, 2.0f));
StartCoroutine(RecoverBump());
}
prevBumped = bumped;
}
public void ChangeAngleZ_noOption(float val)
public void ChangeVelocityXY_zero() // 망할 유니티 애니메이션 이벤트 Vec2를 parameter로 받는 함수를 못집어넣음
{
ChangeAngleZ(val, new bool[] { MovementLock, KnockbackLock });
ChangeVelocityXY_movement(Vector2.zero);
}
public void ChangeVelocityXY_zero() // 망할 유니티 애니메이션 이벤트 Vec2를 parameter로 받는 함수를 못집어넣음
public void ChangeAngleZ_movement(float val)
{
ChangeVelocityXY(Vector2.zero, new bool[] { MovementLock, KnockbackLock });
if (movementLock != EnemyMovementLock.Free) { return; }
ChangeAngleZ(val);
}
public void ChangeVelocityXY_noOption(Vector2 val)
public void ChangeVelocityXY_movement(Vector2 val)
{
ChangeVelocityXY(val, new bool[] { MovementLock, KnockbackLock });
if (movementLock != EnemyMovementLock.Free) { return; }
ChangeVelocityXY(val);
}
private void ChangeAngleZ(float val, bool[] lockArray)
private void ChangeAngleZ(float val)
{
foreach (var Lock in lockArray) { if (Lock) { return; } }
Vector3 tempAngle = transform.parent.eulerAngles;
tempAngle.z = val;
transform.parent.eulerAngles = tempAngle;
}
private void ChangeVelocityXY(Vector2 val, bool[] lockArray)
private void ChangeVelocityXY(Vector2 val)
{
foreach (var Lock in lockArray) { if (Lock) { return; } }
Vector3 tempVelocity = transform.parent.gameObject.GetComponent<Rigidbody2D>().velocity;
tempVelocity.x = val.x;
tempVelocity.y = val.y;
transform.parent.gameObject.GetComponent<Rigidbody2D>().velocity = tempVelocity;
}
// - Knockback coroutine
protected override IEnumerator Knockback(float knockbackDist, float knockbackTime)
{
Vector2 knockbackDir = (transform.parent.position - enemyManager.Player.transform.position).normalized;
Vector2 knockbackVelocity = (knockbackDist / knockbackTime) * knockbackDir;
ChangeAngleZ(90 + Mathf.Rad2Deg * Mathf.Atan2(knockbackDir.y, knockbackDir.x));
ChangeVelocityXY(knockbackVelocity);
yield return new WaitForSeconds(knockbackTime);
ChangeVelocityXY(Vector2.zero);
if (movementLock != EnemyMovementLock.Debuffed)
{
movementLock = EnemyMovementLock.Free;
}
}
protected override IEnumerator OnIce(float duration)
{
GetComponent<SpriteRenderer>().color = new Color(0.5f, 0.5f, 1f);
ChangeVelocityXY(Vector2.zero, new bool[] { });
KnockbackLock = true;
bumped = true;
animator.SetTrigger("StunnedTrigger");
animator.speed = stunnedAnimLength / duration;
yield return new WaitForSeconds(duration);
bumped = false;
OffDebuff(EnemyDebuffCase.Ice);
}
protected override IEnumerator OnStun(float duration)
{
ChangeVelocityXY(Vector2.zero, new bool[] { });
bumped = true;
animator.SetTrigger("StunnedTrigger");
animator.speed = stunnedAnimLength / duration;
yield return new WaitForSeconds(duration);
OffDebuff(EnemyDebuffCase.Stun);
bumped = false;
yield return null;
}
// - Knockback coroutine
protected override IEnumerator Knockback(float knockbackDist, float knockbackTime)
IEnumerator RecoverBump()
{
MovementLock = true;
bool[] lockArray = new bool[] { false, KnockbackLock };
Vector2 knockbackDir = (transform.parent.position - GameManager.Instance.player.transform.position).normalized;
Vector2 knockbackVelocity = (knockbackDist / knockbackTime) * knockbackDir;
ChangeAngleZ(Mathf.Atan2(knockbackDir.y, knockbackDir.x) * -1, new bool[] { MovementLock, KnockbackLock });
ChangeVelocityXY(knockbackVelocity, lockArray);
yield return new WaitForSeconds(knockbackTime);
MovementLock = false;
ChangeVelocityXY(Vector2.zero, new bool[] { MovementLock, KnockbackLock });
}
IEnumerator BumpCheck()
{
while (true)
{
if (!bumpable) { bumpable = true; }
yield return new WaitForSeconds(1.0f);
}
yield return new WaitForSeconds(2.0f);
bumped = false;
}
}
......@@ -6,10 +6,9 @@ using System;
public class EnemyGround : Enemy {
public float attackRange;
public int MoveDir { get; private set; }
public bool[] WallTest { get; private set; }
public bool[] CliffTest { get; private set; }
public bool[] WallTest;
public bool[] CliffTest;
protected override void Awake()
{
......@@ -38,7 +37,6 @@ public class EnemyGround : Enemy {
// - Check whether enemy is near to cliff
private void CheckCliff()
{
Vector2 velocity = transform.parent.GetComponent<Rigidbody2D>().velocity;
Vector2 colliderSize = transform.parent.GetComponent<BoxCollider2D>().size;
foreach (int Dir in Enum.GetValues(typeof(NumeratedDir)))
......@@ -46,8 +44,7 @@ public class EnemyGround : Enemy {
Vector2 origin = (Vector2)transform.parent.position + Dir * new Vector2(colliderSize.x / 2.0f, 0);
Vector2 direction = Vector2.down;
float distance = colliderSize.y / 4.0f;
int layerMask = LayerMask.NameToLayer("platform");
RaycastHit2D hit = Physics2D.Raycast(origin, direction, distance, layerMask);
RaycastHit2D hit = Physics2D.Raycast(origin, direction, distance, enemyManager.layerMaskPlatform);
CliffTest[(Dir + 1) / 2] = (hit.collider == null);
}
......@@ -60,11 +57,10 @@ public class EnemyGround : Enemy {
foreach (int Dir in Enum.GetValues(typeof(NumeratedDir)))
{
Vector2 origin = (Vector2)transform.parent.position + new Vector2(Dir * colliderSize.x / 2.0f, colliderSize.y);
Vector2 origin = (Vector2)transform.parent.position + new Vector2(Dir * colliderSize.x / 2.0f, colliderSize.y / 2.0f);
Vector2 direction = Vector2.right * Dir;
float distance = 0.5f;
LayerMask layerMask = LayerMask.GetMask("Wall", "OuterWall");
RaycastHit2D hit = Physics2D.Raycast(origin, direction, distance, layerMask);
float distance = 0.2f;
RaycastHit2D hit = Physics2D.Raycast(origin, direction, distance, enemyManager.layerMaskWall);
WallTest[(Dir + 1) / 2] = (hit.collider != null);
}
......@@ -72,60 +68,62 @@ public class EnemyGround : Enemy {
// - Change direction, and speed of rigidbody of enemy
public void ChangeVelocityX_noOption(float val)
public void ChangeVelocityX_movement(float val)
{
ChangeVelocityX(val, new bool[] { MovementLock, KnockbackLock });
if(movementLock != EnemyMovementLock.Free) { return; }
ChangeVelocityX(val);
}
public void ChangeDir_noOption(object dir)
public void ChangeDir_movement(object dir)
{
ChangeDir(dir, new bool[] { MovementLock, KnockbackLock });
if (movementLock != EnemyMovementLock.Free) { return; }
ChangeDir(dir);
}
private void ChangeVelocityX(float val, bool[] lockArray)
private void ChangeVelocityX(float val)
{
foreach (var Lock in lockArray) { if (Lock) return; }
Vector2 tempVelocity = transform.parent.GetComponent<Rigidbody2D>().velocity;
tempVelocity.x = val;
transform.parent.GetComponent<Rigidbody2D>().velocity = tempVelocity;
}
private void ChangeDir(object dir, bool[] lockArray)
private void ChangeDir(object dir)
{
foreach (var Lock in lockArray) { if (Lock) return; }
MoveDir = (int)dir;
transform.parent.eulerAngles = ((NumeratedDir)dir == NumeratedDir.Left) ? new Vector2(0, 0) : new Vector2(0, 180);
}
private void ChangeDir_forAnimation()
{
int knockbackDir = (GameManager.Instance.player.transform.position.x - transform.parent.position.x >= 0) ? -1 : 1;
ChangeDir(knockbackDir * -1);
}
// - Knockback coroutine
protected override IEnumerator Knockback(float knockbackDist, float knockbackTime)
{
MovementLock = true;
bool[] lockArray = new bool[] { false, KnockbackLock };
int knockbackDir = (GameManager.Instance.player.transform.position.x - transform.parent.position.x >= 0) ? -1 : 1;
float knockbackVelocity = knockbackDir * knockbackDist / knockbackTime;
ChangeDir(knockbackDir * -1, new bool[] { MovementLock, KnockbackLock });
ChangeVelocityX(knockbackVelocity, lockArray);
//ChangeDir(knockbackDir * -1);
ChangeVelocityX(knockbackVelocity);
for (float timer = 0; timer <= knockbackTime; timer += Time.deltaTime)
{
if (CliffTest[(knockbackDir + 1) / 2])
{
ChangeVelocityX(0.0f, lockArray);
ChangeVelocityX(0.0f);
yield return new WaitForSeconds(knockbackTime - timer);
break;
}
yield return new WaitForFixedUpdate();
}
MovementLock = false;
ChangeVelocityX(0.0f, new bool[] { MovementLock, KnockbackLock });
ChangeVelocityX(0.0f);
if (movementLock != EnemyMovementLock.Debuffed) movementLock = EnemyMovementLock.Free;
}
protected override IEnumerator OnIce(float duration)
{
GetComponent<SpriteRenderer>().color = new Color(0.5f, 0.5f, 1f);
ChangeVelocityX(0.0f, new bool[] { });
KnockbackLock = true;
animator.SetTrigger("StunnedTrigger");
animator.speed = stunnedAnimLength / duration;
yield return new WaitForSeconds(duration);
......@@ -134,11 +132,10 @@ public class EnemyGround : Enemy {
protected override IEnumerator OnStun(float duration)
{
ChangeVelocityX(0.0f, new bool[] { });
animator.SetTrigger("StunnedTrigger");
yield return new WaitUntil(() => animator.GetCurrentAnimatorStateInfo(0).IsName("Stunned"));
animator.speed = stunnedAnimLength / duration;
yield return new WaitForSeconds(duration);
OffDebuff(EnemyDebuffCase.Stun);
yield return null;
}
}
......@@ -5,17 +5,17 @@ using UnityEngine;
public class Scarecrow : Enemy {
public bool neverDie;
public override void GetDamaged(PlayerAttackInfo attack)
public override void GetHit(PlayerAttackInfo attack)
{
if (Invisible) { return; }
float prevHealth = currHealth;
currHealth -= attack.damage;
float prevHealth = CurrHealth;
CurrHealth -= attack.damage;
if (currHealth <= 0)
if (CurrHealth <= 0)
{
if (neverDie)
{
currHealth = maxHealth;
CurrHealth = maxHealth;
}
else
{
......
......@@ -33,6 +33,9 @@ public class EnemyManager : Singleton<EnemyManager>
private uint EnemySpawnCount;
public uint EnemyDeadCount;
// wall or platform
public LayerMask layerMaskWall;
public LayerMask layerMaskPlatform;
// method
// Constructor - protect calling raw constructor
......@@ -62,32 +65,27 @@ public class EnemyManager : Singleton<EnemyManager>
{
GameObject clone = PickFromPool(enemy);
clone.transform.position = location.position;
clone.transform.SetParent(MapManager.currentRoom.roomInGame.transform);
clone.transform.SetParent(MapManager.currentRoom.transform);
}
}
}
// Spawn Enemy to Map
public void SpawnEnemyToMap_forTest()
public bool IsClear()
{
EnemySpawnCount = EnemyDeadCount = 0;
Transform enemySpots = GameObject.Find("Grid").transform.GetChild(0).GetChild(0).Find("enemy spot");
foreach (Transform enemySpot in enemySpots)
return (EnemyDeadCount == EnemySpawnCount);
}
public int CountEnemyInMap()
{
if (!enemySpot.gameObject.activeSelf) continue;
GameObject enemy = enemySpot.gameObject.GetComponent<enemySpot>().enemyPrefab;
foreach (Transform location in enemySpot)
int cnt = 0;
foreach(Transform obj in MapManager.currentRoom.transform)
{
GameObject clone = PickFromPool(enemy);
clone.transform.position = location.position;
clone.transform.SetParent(MapManager.currentRoom.roomInGame.transform);
}
if (obj.gameObject.CompareTag("enemy"))
{
cnt++;
}
}
public bool IsClear()
{
return (EnemyDeadCount == EnemySpawnCount);
return cnt;
}
// Object Pool
......
......@@ -21,6 +21,13 @@ public enum NumeratedDir
Right = 1
};
public enum EnemyMovementLock
{
Free,
Rigid,
Debuffed
};
public enum PlayerDebuffCase
{
......
......@@ -31,7 +31,7 @@ public class HPBar : MonoBehaviour {
instBor.transform.localScale = new Vector3(width / instBor.GetComponent<SpriteRenderer>().size.x, height / instBor.GetComponent<SpriteRenderer>().size.y, 1);
instBor.transform.position = transform.parent.position + new Vector3(0, yOffset, 0);
float cur = Mathf.Max(0,transform.parent.GetComponentInChildren<Enemy>().currHealth / transform.parent.GetComponentInChildren<Enemy>().maxHealth);
float cur = Mathf.Max(0,transform.parent.GetComponentInChildren<Enemy>().CurrHealth / transform.parent.GetComponentInChildren<Enemy>().maxHealth);
instRed.SetActive(true);
instRed.transform.localScale = new Vector3((width / instRed.GetComponent<SpriteRenderer>().size.x - height / instRed.GetComponent<SpriteRenderer>().size.y * 0.2f) * cur, height / instRed.GetComponent<SpriteRenderer>().size.y * 0.8f, 1);
instRed.transform.position = transform.parent.position + new Vector3((width - height * 0.2f) / -2f, yOffset, 0);
......
......@@ -22,7 +22,7 @@ public class Gluttony : Addon
}
public override void OtherEffect(PlayerAttackInfo attackInfo, Enemy enemyInfo, string combo)
{
if(attackInfo.damage >= enemyInfo.currHealth)
if(attackInfo.damage >= enemyInfo.CurrHealth)
{
lifeStoneManager.FillLifeStone(1, LifeStoneType.Normal);
}
......
......@@ -26,7 +26,7 @@ public class JanusCoin : Addon
}
else
{
return enemyInfo.currHealth * 0.25f;
return enemyInfo.CurrHealth * 0.25f;
}
}
}
\ No newline at end of file
......@@ -65,7 +65,7 @@ public class ShockStick : Item {
{
PlayerAttackInfo attack = new PlayerAttackInfo(20f, 0f, new float[(int)EnemyDebuffCase.END_POINTER] { 0, 0, 2, 0, 0 });
AttackCalculation(attack, enemy, combo[1]);
enemy.GetDamaged(attack);
enemy.GetHit(attack);
EffectManager.Instance.StartEffect(0, enemy.gameObject.transform.position);
EffectManager.Instance.StartNumber(1, enemy.gameObject.transform.position, attack.damage);
}
......
......@@ -57,7 +57,7 @@ public class Test : MonoBehaviour {
}
public void SummonEnemy()
{
EnemyManager.Instance.SpawnEnemyToMap_forTest();
EnemyManager.Instance.SpawnEnemyToMap();
}
......
......@@ -52,4 +52,4 @@ Physics2DSettings:
m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432}
m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745}
m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804}
m_LayerCollisionMatrix: fedffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9ff6ffffdffffffffffffffedff6ffffffffffffffffffffdff6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
m_LayerCollisionMatrix: fedfeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffe9fe6ffffdffffffffffffffedfe6ffffffffffffffffffffdfe6fffed7f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
......@@ -32,7 +32,7 @@ TagManager:
- EnemyTrigger
- EnemyAttack
- Player
-
- EnemyColliderAir
-
-
-
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment