Commit 753e071e authored by 15김민규's avatar 15김민규

넉백 구현. 움직임 제대로 나옴.

parent b062ff54
......@@ -108,6 +108,13 @@ AnimationClip:
m_HasMotionFloatCurves: 0
m_GenerateMotionCurves: 0
m_Events:
- time: 0
functionName: ChangeVelocityX
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
- time: 1
functionName: DeadEvent
data:
......
......@@ -192,9 +192,6 @@ AnimatorStateTransition:
m_PrefabInternal: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 1
m_ConditionEvent: TrackTrigger
m_EventTreshold: 0
- m_ConditionMode: 1
m_ConditionEvent: TrackTrigger
m_EventTreshold: 0
......@@ -272,8 +269,7 @@ AnimatorState:
m_CycleOffset: 0
m_Transitions:
- {fileID: 1101117024733671452}
m_StateMachineBehaviours:
- {fileID: 114316214165794054}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
......
......@@ -45,7 +45,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!1 &1734061800721222
GameObject:
m_ObjectHideFlags: 1
......@@ -149,7 +149,7 @@ Rigidbody2D:
m_Mass: 1
m_LinearDrag: 0
m_AngularDrag: 0.05
m_GravityScale: 30
m_GravityScale: 1
m_Material: {fileID: 0}
m_Interpolate: 0
m_SleepingMode: 1
......@@ -260,7 +260,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
monsterID: 117
maxHealth: 15
maxHealth: 55
weight: 10
patrolRange: 2
noticeRange: 2
......
......@@ -1108,6 +1108,11 @@ MonoBehaviour:
type: 2}
m_PrefabInternal: {fileID: 1711972807}
m_Script: {fileID: 11500000, guid: 7fe540ec78947fc449eabc76bd87823d, type: 3}
--- !u!4 &1207417820 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 4874486600194970, guid: 0443c2e9410bbe545bda40dc30fa6a63,
type: 2}
m_PrefabInternal: {fileID: 1787348169}
--- !u!224 &1209430809 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 224402251087470820, guid: c179f0931cfabec428a868a6edc543b0,
......@@ -1150,7 +1155,7 @@ Transform:
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 1509282194}
- {fileID: 1207417820}
m_Father: {fileID: 0}
m_RootOrder: 4
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
......@@ -1330,62 +1335,6 @@ Canvas:
m_CorrespondingSourceObject: {fileID: 223237664237935382, guid: 692aad2449e06054799ea4706578fb23,
type: 2}
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: 1
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: 1
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
Transform:
m_CorrespondingSourceObject: {fileID: 4884929250924374, guid: e6794ab8e2e4c6340a23b382e9497cbb,
......@@ -1640,6 +1589,57 @@ Prefab:
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: c179f0931cfabec428a868a6edc543b0, type: 2}
m_IsPrefabAsset: 0
--- !u!1001 &1787348169
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!114 &1908917313 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 114939219159237616, guid: 62a83d11a7addc342ad436145784e698,
......
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyDamaged : StateMachineBehaviour {
RuntimeAnimatorController ac;
float knockbackTime;
float knockbackSpeed;
float knockbackDir; // 1: right \ -1: left
Vector3 leftsideAngle = new Vector3(0, 0, 0);
Vector3 rightsideAngle = new Vector3(0, 180, 0);
Transform pivotTransform;
// 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) {
ac = animator.runtimeAnimatorController;
foreach(var clip in ac.animationClips)
{
if (clip.name.Contains("Damaged"))
{
knockbackTime = clip.length;
}
}
knockbackSpeed = animator.GetFloat("knockbackDistance") / knockbackTime;
Transform playerTransform = EnemyManager.Instance.Player.transform;
pivotTransform = animator.transform.parent;
pivotTransform.eulerAngles = (playerTransform.position.x - pivotTransform.position.x < 0) ? leftsideAngle : rightsideAngle;
knockbackDir = (playerTransform.position.x - pivotTransform.position.x < 0) ? 1 : -1;
}
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
Vector2 currPosition = pivotTransform.position;
Vector2 movingDistance = new Vector2(knockbackSpeed * Time.deltaTime, 0) * knockbackDir;
pivotTransform.gameObject.GetComponent<Rigidbody2D>().MovePosition(currPosition + movingDistance);
}
// OnStateExit is called when a transition ends and the state machine finishes evaluating this state
//override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
//
//}
// OnStateMove is called right after Animator.OnAnimatorMove(). Code that processes and affects root motion should be implemented here
//override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
//
//}
// OnStateIK is called right after Animator.OnAnimatorIK(). Code that sets up animation IK (inverse kinematics) should be implemented here.
//override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
//
//}
}
fileFormatVersion: 2
guid: 752c7d4f7a0f1444c84cadeae1fab1d7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
......@@ -31,6 +31,8 @@ public class EnemyMeleeIdle : StateMachineBehaviour {
animator.SetTrigger("TrackTrigger");
return;
}
if (!enemy.DuringKnockback)
{
float span = animatorRoot.position.x - origin.x;
if ((Mathf.Abs(span) > patrolRange && span * enemy.MoveDir > 0) ||
......@@ -42,6 +44,7 @@ public class EnemyMeleeIdle : StateMachineBehaviour {
enemy.ChangeVelocityX(enemy.MoveDir * patrolSpeed);
}
}
}
// OnStateExit is called when a transition ends and the state machine finishes evaluating this state
//override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
......
......@@ -22,8 +22,15 @@ public class EnemyMeleeTrack : StateMachineBehaviour {
attackRange = enemy.attackRange;
NumeratedDir trackDir = (animatorRoot.position.x - player.transform.position.x > 0) ? NumeratedDir.Left : NumeratedDir.Right;
enemy.ChangeVelocityX(trackSpeed);
enemy.ChangeDir(trackDir);
if (enemy.CliffTest[(enemy.MoveDir + 1) / 2] || animator.GetComponent<Enemy>().PlayerDistance < attackRange)
{
enemy.ChangeVelocityX(0.0f);
}
else
{
enemy.ChangeVelocityX(enemy.MoveDir * trackSpeed);
}
}
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
......@@ -33,7 +40,6 @@ public class EnemyMeleeTrack : StateMachineBehaviour {
animator.SetTrigger("AttackTrigger");
return;
}
int integerDir = enemy.MoveDir;
if (enemy.WallTest[(integerDir + 1) / 2] || enemy.CliffTest[(integerDir + 1) / 2])
{
......
......@@ -41,8 +41,18 @@ public class Enemy : MonoBehaviour {
public float PlayerDistance { get; private set; }
private readonly float knockbackCritPoint = 0.25f;
public bool[] WallTest { get; private set; } // {left, right}
public bool[] CliffTest { get; private set; } // {left, right}
public bool[] WallTest { get; private set; }
public bool[] CliffTest { get; private set; }
/*
public bool[] WallTest { get { return wallTest; } private set { wallTest = value; } } // {left, right}
public bool[] CliffTest { get { return cliffTest; } private set { cliffTest = value; } } // {left, right}
[SerializeField]
private bool[] wallTest;
[SerializeField]
private bool[] cliffTest;
*/
public int MoveDir { get; private set; }
......@@ -68,10 +78,11 @@ public class Enemy : MonoBehaviour {
currHealth = maxHealth;
Invisible = DuringKnockback = false;
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>());
PlayerDistance = Vector2.Distance(enemyManager.Player.transform.position, transform.parent.position);
}
private void Update()
private void FixedUpdate()
{
PlayerDistance = Vector2.Distance(enemyManager.Player.transform.position, transform.parent.position);
CheckCliff(); CheckWall();
......@@ -87,7 +98,7 @@ public class Enemy : MonoBehaviour {
{
Vector2 origin = (Vector2)transform.parent.position + Dir * new Vector2(colliderSize.x / 2.0f, 0);
Vector2 direction = Vector2.down;
float distance = colliderSize.y / 2.0f;
float distance = colliderSize.y / 4.0f;
int layerMask = LayerMask.NameToLayer("platform");
RaycastHit2D hit = Physics2D.Raycast(origin, direction, distance, layerMask);
......@@ -101,7 +112,7 @@ public class Enemy : MonoBehaviour {
foreach (int Dir in Enum.GetValues(typeof(NumeratedDir)))
{
Vector2 origin = (Vector2)transform.parent.position + Dir * new Vector2(colliderSize.x / 2.0f, 0);
Vector2 origin = (Vector2)transform.parent.position + new Vector2(Dir * colliderSize.x / 2.0f, colliderSize.y);
Vector2 direction = Vector2.right * Dir;
float distance = 0.02f;
int layerMask = LayerMask.GetMask("Wall", "OuterWall");
......@@ -124,8 +135,10 @@ public class Enemy : MonoBehaviour {
float knockbackDist = attack.damage * attack.knockBackMultiplier / weight;
float knockbackTime = (knockbackDist >= 0.5f) ? 0.5f : knockbackDist;
if (!DuringKnockback)
if (DuringKnockback)
{
StopCoroutine("Knockback");
}
StartCoroutine(Knockback(knockbackDist, knockbackTime));
if (knockbackDist >= knockbackCritPoint)
......@@ -134,25 +147,37 @@ public class Enemy : MonoBehaviour {
animator.SetTrigger("DamagedTrigger");
}
}
}
// change speed of rigidbody of enemy
// change direction, and speed of rigidbody of enemy
public void ChangeVelocityX(float val)
{
if (!DuringKnockback)
{
Vector2 tempVelocity = transform.parent.GetComponent<Rigidbody2D>().velocity;
tempVelocity.x = val;
transform.parent.GetComponent<Rigidbody2D>().velocity = tempVelocity;
}
}
private void SudoChangeVelocityX(float val)
{
Vector2 tempVelocity = transform.parent.GetComponent<Rigidbody2D>().velocity;
tempVelocity.x = val;
transform.parent.GetComponent<Rigidbody2D>().velocity = tempVelocity;
}
public void ChangeDir(NumeratedDir dir)
public void ChangeDir(object dir)
{
if (!DuringKnockback)
{
MoveDir = (int)dir;
transform.parent.eulerAngles = (dir == NumeratedDir.Left) ? new Vector2(0, 0) : new Vector2(0, 180);
transform.parent.eulerAngles = ((NumeratedDir)dir == NumeratedDir.Left) ? new Vector2(0, 0) : new Vector2(0, 180);
}
}
public void ChangeDir(int dir)
private void SudoChangeDir(object dir)
{
MoveDir = dir;
MoveDir = (int)dir;
transform.parent.eulerAngles = ((NumeratedDir)dir == NumeratedDir.Left) ? new Vector2(0, 0) : new Vector2(0, 180);
}
......@@ -210,19 +235,23 @@ public class Enemy : MonoBehaviour {
IEnumerator Knockback(float knockbackDist, float knockbackTime)
{
DuringKnockback = true;
NumeratedDir isPlayerLeft = (enemyManager.Player.transform.position.x - transform.parent.position.x <= 0) ?
NumeratedDir.Left : NumeratedDir.Right;
float knockbackVelocity = (int)isPlayerLeft * knockbackDist / knockbackTime;
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;
tempVelocity.x = knockbackVelocity;
transform.parent.GetComponent<Rigidbody2D>().velocity = tempVelocity;
yield return new WaitForSeconds(knockbackTime);
int knockbackDir = (enemyManager.Player.transform.position.x - transform.parent.position.x >= 0) ? -1 : 1;
float knockbackVelocity = knockbackDir * knockbackDist / knockbackTime;
SudoChangeDir(knockbackDir * -1);
SudoChangeVelocityX(knockbackVelocity);
for (float timer = 0; timer <= knockbackTime; timer += Time.deltaTime)
{
if (CliffTest[(knockbackDir + 1) / 2])
{
SudoChangeVelocityX(0.0f);
yield return new WaitForSeconds(knockbackTime - timer);
break;
}
yield return new WaitForFixedUpdate();
}
DuringKnockback = false;
ChangeVelocityX(0.0f);
}
// Debuff
......
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