Commit c626bd44 authored by 15김민규's avatar 15김민규

벽, 낭떠러지 체크 확인 가능하도록 함. velocity로 움직이는 것을 Idle까지 개선. Enum 및 Enemy에서의 함수를 통해 반복되는 행동 간략화

parent de12185d
...@@ -13,31 +13,31 @@ AnimatorController: ...@@ -13,31 +13,31 @@ AnimatorController:
m_DefaultFloat: 0 m_DefaultFloat: 0
m_DefaultInt: 0 m_DefaultInt: 0
m_DefaultBool: 0 m_DefaultBool: 0
m_Controller: {fileID: 0} m_Controller: {fileID: 9100000}
- m_Name: AttackTrigger - m_Name: AttackTrigger
m_Type: 9 m_Type: 9
m_DefaultFloat: 0 m_DefaultFloat: 0
m_DefaultInt: 0 m_DefaultInt: 0
m_DefaultBool: 0 m_DefaultBool: 0
m_Controller: {fileID: 0} m_Controller: {fileID: 9100000}
- m_Name: DamagedTrigger - m_Name: DamagedTrigger
m_Type: 9 m_Type: 9
m_DefaultFloat: 0 m_DefaultFloat: 0
m_DefaultInt: 0 m_DefaultInt: 0
m_DefaultBool: 0 m_DefaultBool: 0
m_Controller: {fileID: 0} m_Controller: {fileID: 9100000}
- m_Name: DeadTrigger - m_Name: DeadTrigger
m_Type: 9 m_Type: 9
m_DefaultFloat: 0 m_DefaultFloat: 0
m_DefaultInt: 0 m_DefaultInt: 0
m_DefaultBool: 0 m_DefaultBool: 0
m_Controller: {fileID: 0} m_Controller: {fileID: 9100000}
- m_Name: knockbackTime - m_Name: knockbackTime
m_Type: 1 m_Type: 1
m_DefaultFloat: 0 m_DefaultFloat: 0
m_DefaultInt: 0 m_DefaultInt: 0
m_DefaultBool: 0 m_DefaultBool: 0
m_Controller: {fileID: 0} m_Controller: {fileID: 9100000}
m_AnimatorLayers: m_AnimatorLayers:
- serializedVersion: 5 - serializedVersion: 5
m_Name: Base Layer m_Name: Base Layer
......
...@@ -219,7 +219,7 @@ Transform: ...@@ -219,7 +219,7 @@ Transform:
m_PrefabInternal: {fileID: 100100000} m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 1124637384100458} m_GameObject: {fileID: 1124637384100458}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 2.5, y: 9, z: 0} m_LocalPosition: {x: 4, y: 9, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: [] m_Children: []
m_Father: {fileID: 4054145534218116} m_Father: {fileID: 4054145534218116}
......
...@@ -1149,7 +1149,8 @@ Transform: ...@@ -1149,7 +1149,8 @@ Transform:
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: [] m_Children:
- {fileID: 1509282194}
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 4 m_RootOrder: 4
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
...@@ -1329,6 +1330,62 @@ Canvas: ...@@ -1329,6 +1330,62 @@ Canvas:
m_CorrespondingSourceObject: {fileID: 223237664237935382, guid: 692aad2449e06054799ea4706578fb23, m_CorrespondingSourceObject: {fileID: 223237664237935382, guid: 692aad2449e06054799ea4706578fb23,
type: 2} type: 2}
m_PrefabInternal: {fileID: 28941081} m_PrefabInternal: {fileID: 28941081}
--- !u!1001 &1509282193
Prefab:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 1244139631}
m_Modifications:
- target: {fileID: 66792933649035248, guid: 0443c2e9410bbe545bda40dc30fa6a63,
type: 2}
propertyPath: m_ColliderPaths.Array.size
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4874486600194970, guid: 0443c2e9410bbe545bda40dc30fa6a63, type: 2}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4874486600194970, guid: 0443c2e9410bbe545bda40dc30fa6a63, type: 2}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4874486600194970, guid: 0443c2e9410bbe545bda40dc30fa6a63, type: 2}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4874486600194970, guid: 0443c2e9410bbe545bda40dc30fa6a63, type: 2}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4874486600194970, guid: 0443c2e9410bbe545bda40dc30fa6a63, type: 2}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4874486600194970, guid: 0443c2e9410bbe545bda40dc30fa6a63, type: 2}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4874486600194970, guid: 0443c2e9410bbe545bda40dc30fa6a63, type: 2}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4874486600194970, guid: 0443c2e9410bbe545bda40dc30fa6a63, type: 2}
propertyPath: m_RootOrder
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1915452461634262, guid: 0443c2e9410bbe545bda40dc30fa6a63, type: 2}
propertyPath: m_IsActive
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 0443c2e9410bbe545bda40dc30fa6a63, type: 2}
m_IsPrefabAsset: 0
--- !u!4 &1509282194 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 4874486600194970, guid: 0443c2e9410bbe545bda40dc30fa6a63,
type: 2}
m_PrefabInternal: {fileID: 1509282193}
--- !u!4 &1604462410 stripped --- !u!4 &1604462410 stripped
Transform: Transform:
m_CorrespondingSourceObject: {fileID: 4884929250924374, guid: e6794ab8e2e4c6340a23b382e9497cbb, m_CorrespondingSourceObject: {fileID: 4884929250924374, guid: e6794ab8e2e4c6340a23b382e9497cbb,
......
...@@ -11,30 +11,39 @@ public class EnemyMeleeIdle : StateMachineBehaviour { ...@@ -11,30 +11,39 @@ public class EnemyMeleeIdle : StateMachineBehaviour {
Vector3 leftsideAngle = new Vector3(0, 0, 0); Vector3 leftsideAngle = new Vector3(0, 0, 0);
Vector3 rightsideAngle = new Vector3(0, 180, 0); Vector3 rightsideAngle = new Vector3(0, 180, 0);
Transform animatorRoot; Transform animatorRoot;
Enemy enemy;
NumeratedDir moveDir = NumeratedDir.Left; // go left first
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state // 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) { override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
origin = animator.transform.position; origin = animator.transform.position;
patrolRange = animator.GetComponent<Enemy>().patrolRange;
noticeRange = animator.GetComponent<Enemy>().noticeRange;
patrolSpeed = animator.GetComponent<Enemy>().patrolSpeed;
animatorRoot = animator.transform.parent; animatorRoot = animator.transform.parent;
enemy = animator.GetComponent<Enemy>();
patrolRange = enemy.patrolRange;
noticeRange = enemy.noticeRange;
patrolSpeed = enemy.patrolSpeed;
enemy.ChangeDir(NumeratedDir.Left);
enemy.ChangeVelocityX((int)moveDir * patrolSpeed);
} }
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
if (animator.GetComponent<Enemy>().PlayerDistance < noticeRange) if (enemy.PlayerDistance < noticeRange)
{ {
animator.SetTrigger("TrackTrigger"); animator.SetTrigger("TrackTrigger");
return; return;
} }
Vector2 currPosition = animatorRoot.position; int integerDir = (int)enemy.MoveDir;
Vector2 movingDistance = -1 * animatorRoot.right * patrolSpeed * Time.deltaTime; // go left first float span = animatorRoot.position.x - origin.x;
animatorRoot.gameObject.GetComponent<Rigidbody2D>().MovePosition(currPosition + movingDistance);
if(Mathf.Abs(animatorRoot.position.x - origin.x) > patrolRange) if ((Mathf.Abs(span) > patrolRange && span * integerDir > 0) ||
enemy.WallTest[(integerDir + 1) / 2] ||
enemy.CliffTest[(integerDir + 1) / 2]
)
{ {
animatorRoot.eulerAngles = (origin.x < animatorRoot.position.x) ? leftsideAngle : rightsideAngle; enemy.ChangeDir(integerDir * -1);
} }
} }
......
using System.Collections; using System;
using System.Collections.Generic; using System.Collections;
using UnityEngine; using UnityEngine;
using Random = UnityEngine.Random;
public class Enemy : MonoBehaviour { public class Enemy : MonoBehaviour {
...@@ -34,13 +34,18 @@ public class Enemy : MonoBehaviour { ...@@ -34,13 +34,18 @@ public class Enemy : MonoBehaviour {
private LifeStoneManager lifeStoneManager; private LifeStoneManager lifeStoneManager;
private EnemyManager enemyManager; private EnemyManager enemyManager;
// for animation // for movement
private Animator animator; private Animator animator;
public bool Invisible { get; private set; } public bool Invisible { get; private set; }
public bool DuringKnockback { get; private set; } public bool DuringKnockback { get; private set; }
public float PlayerDistance { get; private set; } public float PlayerDistance { get; private set; }
private readonly float knockbackCritPoint = 0.25f; private readonly float knockbackCritPoint = 0.25f;
public bool[] WallTest { get; private set; } // {left, right}
public bool[] CliffTest { get; private set; } // {left, right}
public NumeratedDir MoveDir { get; private set; }
// drop item // drop item
private int[] dropTable; private int[] dropTable;
...@@ -52,69 +57,63 @@ public class Enemy : MonoBehaviour { ...@@ -52,69 +57,63 @@ public class Enemy : MonoBehaviour {
inventoryManager = GameObject.Find("InventoryManager").GetComponent<InventoryManager>(); inventoryManager = GameObject.Find("InventoryManager").GetComponent<InventoryManager>();
lifeStoneManager = GameObject.Find("UI Canvas").transform.GetChild(0).GetComponent<LifeStoneManager>(); lifeStoneManager = GameObject.Find("UI Canvas").transform.GetChild(0).GetComponent<LifeStoneManager>();
animator = GetComponent<Animator>(); animator = GetComponent<Animator>();
WallTest = new bool[] { false, false };
CliffTest = new bool[] { false, false };
} }
private void Start() private void Start()
{ {
MoveDir = NumeratedDir.Left;
currHealth = maxHealth; currHealth = maxHealth;
Invisible = DuringKnockback = false; Invisible = DuringKnockback = false;
dropTable = enemyManager.DropTableByID[monsterID]; dropTable = enemyManager.DropTableByID[monsterID];
Physics2D.IgnoreCollision(enemyManager.Player.gameObject.GetComponent<Collider2D>(), transform.parent.GetComponent<Collider2D>()); Physics2D.IgnoreCollision(enemyManager.Player.gameObject.GetComponent<Collider2D>(), transform.parent.GetComponent<Collider2D>());
} }
private void FixedUpdate()
{
bool wallTest = IsTouchingWall();
if (wallTest)
{
Debug.Log("Touching wall");
}
bool cliffTest = IsAdvancingToCliff();
if (cliffTest)
{
Debug.Log("Advancing to cliff");
}
}
private void Update() private void Update()
{ {
PlayerDistance = Vector2.Distance(enemyManager.Player.transform.position, transform.parent.position); PlayerDistance = Vector2.Distance(enemyManager.Player.transform.position, transform.parent.position);
CheckCliff(); CheckWall();
} }
// check whether enemy is advancing to cliff // check whether enemy is near to cliff
public bool IsAdvancingToCliff() private void CheckCliff()
{ {
Vector2 velocity = transform.parent.GetComponent<Rigidbody2D>().velocity; Vector2 velocity = transform.parent.GetComponent<Rigidbody2D>().velocity;
Vector2 colliderSize = transform.parent.GetComponent<BoxCollider2D>().size; Vector2 colliderSize = transform.parent.GetComponent<BoxCollider2D>().size;
if (velocity.x == 0) { return false; } foreach (int Dir in Enum.GetValues(typeof(NumeratedDir)))
int enemyDir = (velocity.x > 0) ? 1 : -1; {
Vector2 origin = (Vector2)transform.parent.position + Dir * new Vector2(colliderSize.x / 2.0f, 0);
Vector2 origin = (Vector2)transform.parent.position + enemyDir * new Vector2(colliderSize.x / 2.0f, 0);
Vector2 direction = Vector2.down; Vector2 direction = Vector2.down;
float distance = colliderSize.y / 2.0f; float distance = colliderSize.y / 2.0f;
int layerMask = LayerMask.NameToLayer("platform"); int layerMask = LayerMask.NameToLayer("platform");
RaycastHit2D hit = Physics2D.Raycast(origin, direction, distance, layerMask); RaycastHit2D hit = Physics2D.Raycast(origin, direction, distance, layerMask);
return (hit.collider == null); CliffTest[(Dir + 1) / 2] = (hit.collider == null);
} }
}
public bool IsTouchingWall() // check whether enemy is touching wall
private void CheckWall()
{ {
int enemyDir = (transform.parent.eulerAngles.y == 180.0f) ? 1 : -1;
Vector2 colliderSize = transform.parent.GetComponent<BoxCollider2D>().size; Vector2 colliderSize = transform.parent.GetComponent<BoxCollider2D>().size;
Vector2 origin = (Vector2)transform.parent.position + enemyDir * new Vector2(colliderSize.x / 2.0f, 0); foreach (int Dir in Enum.GetValues(typeof(NumeratedDir)))
Vector2 direction = Vector2.right * enemyDir; {
Vector2 origin = (Vector2)transform.parent.position + Dir * new Vector2(colliderSize.x / 2.0f, 0);
Vector2 direction = Vector2.right * Dir;
float distance = 0.02f; float distance = 0.02f;
int layerMask = LayerMask.GetMask("Wall", "OuterWall"); int layerMask = LayerMask.GetMask("Wall", "OuterWall");
RaycastHit2D hit = Physics2D.Raycast(origin, direction, distance, layerMask); RaycastHit2D hit = Physics2D.Raycast(origin, direction, distance, layerMask);
return (hit.collider != null); WallTest[(Dir + 1) / 2] = (hit.collider != null);
}
} }
// hit by player or debuff // hit by player or debuff
public void GetDamaged(PlayerAttackInfo attack) { public void GetDamaged(PlayerAttackInfo attack)
{
currHealth -= attack.damage; currHealth -= attack.damage;
if (currHealth <= 0) if (currHealth <= 0)
{ {
...@@ -137,6 +136,28 @@ public class Enemy : MonoBehaviour { ...@@ -137,6 +136,28 @@ public class Enemy : MonoBehaviour {
} }
} }
// change speed of rigidbody of enemy
public void ChangeVelocityX(float val)
{
Vector2 tempVelocity = transform.parent.GetComponent<Rigidbody2D>().velocity;
tempVelocity.x = val;
transform.parent.GetComponent<Rigidbody2D>().velocity = tempVelocity;
}
public void ChangeDir(NumeratedDir dir)
{
MoveDir = dir;
transform.parent.eulerAngles = (dir == NumeratedDir.Left) ? new Vector2(0, 0) : new Vector2(0, 180);
ChangeVelocityX((int)dir * Mathf.Abs(transform.parent.GetComponent<Rigidbody2D>().velocity.x));
}
public void ChangeDir(int dir)
{
MoveDir = (NumeratedDir)dir;
transform.parent.eulerAngles = ((NumeratedDir)dir == NumeratedDir.Left) ? new Vector2(0, 0) : new Vector2(0, 180);
ChangeVelocityX(dir * Mathf.Abs(transform.parent.GetComponent<Rigidbody2D>().velocity.x));
}
// Animation Event // Animation Event
// Dead // Dead
public void DeadEvent() public void DeadEvent()
...@@ -191,10 +212,11 @@ public class Enemy : MonoBehaviour { ...@@ -191,10 +212,11 @@ public class Enemy : MonoBehaviour {
IEnumerator Knockback(float knockbackDist, float knockbackTime) IEnumerator Knockback(float knockbackDist, float knockbackTime)
{ {
DuringKnockback = true; DuringKnockback = true;
bool isPlayerLeft = (enemyManager.Player.transform.position.x - transform.parent.position.x <= 0); NumeratedDir isPlayerLeft = (enemyManager.Player.transform.position.x - transform.parent.position.x <= 0) ?
NumeratedDir.Left : NumeratedDir.Right;
float knockbackVelocity = ((isPlayerLeft) ? 1 : -1) * knockbackDist / knockbackTime; float knockbackVelocity = (int)isPlayerLeft * knockbackDist / knockbackTime;
transform.parent.eulerAngles = (isPlayerLeft) ? new Vector2(0.0f, 0.0f) : new Vector2(0.0f, 180.0f); transform.parent.eulerAngles = (isPlayerLeft == NumeratedDir.Left) ? new Vector2(0.0f, 0.0f) : new Vector2(0.0f, 180.0f);
Vector2 tempVelocity = transform.parent.GetComponent<Rigidbody2D>().velocity; Vector2 tempVelocity = transform.parent.GetComponent<Rigidbody2D>().velocity;
tempVelocity.x = knockbackVelocity; tempVelocity.x = knockbackVelocity;
......
...@@ -6,6 +6,13 @@ ...@@ -6,6 +6,13 @@
blind, blind,
charm charm
}; };
public enum NumeratedDir
{
Left = -1,
Right = 1
};
public enum PlayerDebuffCase public enum PlayerDebuffCase
{ {
......
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