2026-03-15 점프,예비착지,착지후 경직
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,5 @@
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
using Unity.VisualScripting;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
public class PlayerCharacterController : MonoBehaviour
|
public class PlayerCharacterController : MonoBehaviour
|
||||||
@@ -14,6 +15,8 @@ public class PlayerCharacterController : MonoBehaviour
|
|||||||
private Vector2 _moveInput; // 입력받은 이동 방향
|
private Vector2 _moveInput; // 입력받은 이동 방향
|
||||||
private Vector3 _velocityY = new Vector3(0,-2f,0); // 플레이어Y의 속도 //Y축만 물리법칙의 지배를 일부 받기 때문에 필요
|
private Vector3 _velocityY = new Vector3(0,-2f,0); // 플레이어Y의 속도 //Y축만 물리법칙의 지배를 일부 받기 때문에 필요
|
||||||
private Vector3 _moveTargetDir; // 실제 가고자하는 이동방향
|
private Vector3 _moveTargetDir; // 실제 가고자하는 이동방향
|
||||||
|
private float _moveCutTimer = 0f; //이동금지 타이머
|
||||||
|
private Vector3 _rootMotionVelocity; //루트모션 사용시
|
||||||
|
|
||||||
//캐릭터 스피드
|
//캐릭터 스피드
|
||||||
[SerializeField] private float _spdCoefficient = 4f; //스피드 계수
|
[SerializeField] private float _spdCoefficient = 4f; //스피드 계수
|
||||||
@@ -24,9 +27,11 @@ public class PlayerCharacterController : MonoBehaviour
|
|||||||
private float _currentSpd; //현재 스피드
|
private float _currentSpd; //현재 스피드
|
||||||
|
|
||||||
//점프
|
//점프
|
||||||
[SerializeField] private float _jumpPower = 1.5f; //점프 힘
|
[SerializeField] private float _jumpPower = 3.0f; //점프 힘
|
||||||
private float _jumpReadyCool = 0.8f; //점프 쿨타임
|
private float _jumpReadyCool = 0.8f; //점프 쿨타임
|
||||||
private float _jumpReadyCoolTimer = 0f; //점프 쿨타이머
|
private float _jumpReadyCoolTimer = 0f; //점프 쿨타이머
|
||||||
|
private int _jumpCount = 0;
|
||||||
|
private int _maxJumpCount = 2;
|
||||||
|
|
||||||
//대쉬
|
//대쉬
|
||||||
[SerializeField] private AnimationCurve _dodgeCurve; // 변속용 커브
|
[SerializeField] private AnimationCurve _dodgeCurve; // 변속용 커브
|
||||||
@@ -75,13 +80,21 @@ private void Awake()
|
|||||||
PlayerCharacterStat = GetComponent<PlayerStat>();
|
PlayerCharacterStat = GetComponent<PlayerStat>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_stateMachine.SetMaxJumpCount(_maxJumpCount);
|
||||||
|
}
|
||||||
|
|
||||||
private void Update()
|
private void Update()
|
||||||
{
|
{
|
||||||
//캐릭터 컨트롤러는 FixedUpdate보다 Update에서 하는게 권장됨
|
//캐릭터 컨트롤러는 FixedUpdate보다 Update에서 하는게 권장됨
|
||||||
Movement();
|
|
||||||
CheckGround();
|
CheckGround();
|
||||||
|
|
||||||
|
StateUpdate();
|
||||||
|
|
||||||
|
Movement();
|
||||||
WorkGravity();
|
WorkGravity();
|
||||||
ApplyVelocity();
|
ApplyMove();
|
||||||
|
|
||||||
TickTimer();
|
TickTimer();
|
||||||
//PlayerDebug();
|
//PlayerDebug();
|
||||||
@@ -97,10 +110,66 @@ private void PlayerDebug()
|
|||||||
Debug.Log($"isGrounded : {_stateMachine.IsGrounded}");
|
Debug.Log($"isGrounded : {_stateMachine.IsGrounded}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region 상태 업데이트
|
||||||
|
private void StateUpdate()
|
||||||
|
{
|
||||||
|
// 땅에서 추락할때
|
||||||
|
if (!_stateMachine.IsGrounded && _velocityY.y < 0f && _stateMachine.CurrentState != PlayerState.Attack && _stateMachine.CurrentState != PlayerState.Charge)
|
||||||
|
{
|
||||||
|
_stateMachine.ChangeState(PlayerState.Fall);
|
||||||
|
}
|
||||||
|
//점프에서 바닥에 닿을때
|
||||||
|
else if (_stateMachine.IsGrounded && _stateMachine.CurrentState == PlayerState.Fall)
|
||||||
|
{
|
||||||
|
_stateMachine.ChangeState(PlayerState.Idle);
|
||||||
|
_moveCutTimer = 0.1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_moveInput.sqrMagnitude < Mathf.Epsilon && _stateMachine.CanMove() && _stateMachine.CurrentState != PlayerState.Attack) // 지상 이동이 가능하고 공격중도 아닌데 이동입력이 없는상태 - 거의 0
|
||||||
|
{
|
||||||
|
_stateMachine.ChangeState(PlayerState.Idle);
|
||||||
|
}
|
||||||
|
else if(_stateMachine.CanMove() && _stateMachine.CurrentState != PlayerState.Attack) //지상이동이 가능하고 공격중이 아닌데 이동입력이 있다
|
||||||
|
{
|
||||||
|
// 런키를 누른 상태면 뛰는 상태, 아니면 걷는 상태
|
||||||
|
_stateMachine.ChangeState(_stateMachine.IsRunInputPressed ? PlayerState.Run : PlayerState.Walk);
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Log($"_moveCutTimer : {_moveCutTimer}");
|
||||||
|
|
||||||
|
if (_moveCutTimer > 0)
|
||||||
|
_stateMachine.IsMoveCut = true;
|
||||||
|
else
|
||||||
|
_stateMachine.IsMoveCut = false;
|
||||||
|
|
||||||
|
Debug.Log($"_moveCut : {_stateMachine.IsMoveCut}");
|
||||||
|
Debug.Log($"CurentState : {_stateMachine.CurrentState}");
|
||||||
|
|
||||||
|
if (_jumpReadyCoolTimer > 0)
|
||||||
|
_stateMachine.IsJumpCool = true;
|
||||||
|
else
|
||||||
|
_stateMachine.IsJumpCool = false;
|
||||||
|
|
||||||
|
|
||||||
|
if(_stateMachine.IsGrounded)
|
||||||
|
{
|
||||||
|
_jumpCount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region 체크
|
#region 체크
|
||||||
|
private bool IsCloseToGround(float checkDistance)
|
||||||
|
{
|
||||||
|
return Physics.Raycast(transform.position, Vector3.down, checkDistance);
|
||||||
|
}
|
||||||
private void CheckGround()
|
private void CheckGround()
|
||||||
{
|
{
|
||||||
_stateMachine.IsGrounded = _cController.isGrounded;
|
_stateMachine.IsGrounded = _cController.isGrounded;
|
||||||
|
_stateMachine.IsCloseToGround = IsCloseToGround(0.9f);
|
||||||
|
|
||||||
|
_anim.SetBool("IsGrounded", _stateMachine.IsGrounded);
|
||||||
|
_anim.SetBool("IsCloseToGround", _stateMachine.IsCloseToGround);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -114,39 +183,10 @@ private void WorkGravity()
|
|||||||
|
|
||||||
_velocityY.y += _gravityValue * Time.deltaTime;
|
_velocityY.y += _gravityValue * Time.deltaTime;
|
||||||
_anim.SetFloat("velocityY", _velocityY.y);
|
_anim.SetFloat("velocityY", _velocityY.y);
|
||||||
_anim.SetBool("IsGrounded", _stateMachine.IsGrounded);
|
|
||||||
|
|
||||||
// 상태 자동 전환 로직
|
|
||||||
if (!_stateMachine.IsGrounded && _stateMachine.CurrentState != PlayerState.Jump && _stateMachine.CurrentState != PlayerState.Attack && _stateMachine.CurrentState != PlayerState.Charge)
|
|
||||||
{
|
|
||||||
_stateMachine.ChangeState(PlayerState.Fall);
|
|
||||||
}
|
|
||||||
else if (_stateMachine.IsGrounded && _stateMachine.CurrentState == PlayerState.Fall)
|
|
||||||
{
|
|
||||||
_stateMachine.ChangeState(PlayerState.Idle);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region 이동
|
#region 이동
|
||||||
public void MoveInput(Vector2 moveInput)
|
|
||||||
{
|
|
||||||
if (_stateMachine.CanMove())
|
|
||||||
{
|
|
||||||
_moveInput = moveInput;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public void SprintInput(InputState inputState)
|
|
||||||
{
|
|
||||||
if(inputState == InputState.Performing)
|
|
||||||
{
|
|
||||||
_stateMachine.IsRunInputPressed = true;
|
|
||||||
}
|
|
||||||
else if(inputState == InputState.Canceled)
|
|
||||||
{
|
|
||||||
_stateMachine.IsRunInputPressed = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private void Movement()
|
private void Movement()
|
||||||
{
|
{
|
||||||
//구르기중일때 전용 로직
|
//구르기중일때 전용 로직
|
||||||
@@ -181,29 +221,11 @@ private void Movement()
|
|||||||
|
|
||||||
float targetSpd = 0;
|
float targetSpd = 0;
|
||||||
|
|
||||||
if (_moveInput.sqrMagnitude < Mathf.Epsilon) // 이동이 없는상태 - 거의 0
|
if(_moveInput.sqrMagnitude > Mathf.Epsilon) //입력이 있다
|
||||||
{
|
{
|
||||||
targetSpd = 0f;
|
|
||||||
// 완전히 멈추기 전까지는 이동 상태를 유지하다가 아주 느려지면 Idle 전환
|
|
||||||
if (_currentSpd < 0.05f) _stateMachine.ChangeState(PlayerState.Idle);
|
|
||||||
|
|
||||||
|
|
||||||
//가속도 안쓸시
|
|
||||||
//_currentSpd = 0;
|
|
||||||
//_stateMachine.ChangeState(PlayerState.Idle);
|
|
||||||
}
|
|
||||||
else //이동이 없지 않음 = 이동이 있다
|
|
||||||
{
|
|
||||||
// 런키를 누른 상태면 뛰는 스피드, 아니면 걷는 스피드 적용
|
|
||||||
_stateMachine.ChangeState(_stateMachine.IsRunInputPressed ? PlayerState.Run : PlayerState.Walk);
|
|
||||||
targetSpd = _stateMachine.IsRunInputPressed ? _runSpdRatio * _spdCoefficient : _walkSpdRatio * _spdCoefficient;
|
targetSpd = _stateMachine.IsRunInputPressed ? _runSpdRatio * _spdCoefficient : _walkSpdRatio * _spdCoefficient;
|
||||||
|
|
||||||
//가속도 안쓸시
|
|
||||||
//_stateMachine.ChangeState(_stateMachine.IsRunInputPressed ? PlayerState.Run : PlayerState.Walk);
|
|
||||||
//_currentSpd = _stateMachine.IsRunInputPressed ? _runSpdRatio * _spdCoefficient : _walkSpdRatio * _spdCoefficient;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// _currentSpd가 targetSpd로 서서히 접근
|
// _currentSpd가 targetSpd로 서서히 접근
|
||||||
float accelWeight = _stateMachine.CurrentState == PlayerState.Run ? 2 : 1; //런일때 가속도 가중치
|
float accelWeight = _stateMachine.CurrentState == PlayerState.Run ? 2 : 1; //런일때 가속도 가중치
|
||||||
float currentStepSpeed = (targetSpd > _currentSpd) ? _acceleration : _deceleration;
|
float currentStepSpeed = (targetSpd > _currentSpd) ? _acceleration : _deceleration;
|
||||||
@@ -236,14 +258,81 @@ private void RotationByMove()
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region 속도적용
|
#region 속도적용
|
||||||
private void ApplyVelocity()
|
private void OnAnimatorMove()
|
||||||
{
|
{
|
||||||
|
// 애니메이션이 가고 싶은 값
|
||||||
|
/*
|
||||||
|
if(_stateMachine.CurrentState == PlayerState.Roll)
|
||||||
|
{
|
||||||
|
_rootMotionVelocity = _anim.deltaPosition / Time.deltaTime;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
private void ApplyMove()
|
||||||
|
{
|
||||||
|
//지상이동이 가능한 상황이 아니고, 공중이동도 가능한 상황이 아니라면
|
||||||
|
if (!_stateMachine.CanMove() && !_stateMachine.CanControlInAir())
|
||||||
|
{
|
||||||
|
_moveTargetDir.x = 0f;
|
||||||
|
_moveTargetDir.z = 0f;
|
||||||
|
}
|
||||||
|
|
||||||
Vector3 finalVector = new Vector3(_moveTargetDir.x, _velocityY.y, _moveTargetDir.z);
|
Vector3 finalVector = new Vector3(_moveTargetDir.x, _velocityY.y, _moveTargetDir.z);
|
||||||
|
|
||||||
_cController.Move(finalVector * Time.deltaTime); // xz 이동벡터를 적용
|
_cController.Move(finalVector * Time.deltaTime); // xz 이동벡터를 적용
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 점프
|
||||||
|
private void JumpAction()
|
||||||
|
{
|
||||||
|
_velocityY.y = Mathf.Sqrt(_jumpPower * -2f * _gravityValue);
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region 대시(구르기,횡이동등)
|
#region 타미어
|
||||||
|
private void TickTimer()
|
||||||
|
{
|
||||||
|
if (_jumpReadyCoolTimer > 0) _jumpReadyCoolTimer -= Time.deltaTime; if (_jumpReadyCoolTimer < 0) _jumpReadyCoolTimer = 0f;
|
||||||
|
if (_moveCutTimer > 0) _moveCutTimer -= Time.deltaTime; if (_moveCutTimer < 0) _moveCutTimer = 0f;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 입력
|
||||||
|
public void MoveInput(Vector2 moveInput)
|
||||||
|
{
|
||||||
|
_moveInput = moveInput;
|
||||||
|
}
|
||||||
|
public void SprintInput(InputState inputState)
|
||||||
|
{
|
||||||
|
if (inputState == InputState.Performing)
|
||||||
|
{
|
||||||
|
_stateMachine.IsRunInputPressed = true;
|
||||||
|
}
|
||||||
|
else if (inputState == InputState.Canceled)
|
||||||
|
{
|
||||||
|
_stateMachine.IsRunInputPressed = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void JumpInput(InputState inputState)
|
||||||
|
{
|
||||||
|
if (_stateMachine.CanJump())
|
||||||
|
{
|
||||||
|
if (inputState == InputState.Started)
|
||||||
|
{
|
||||||
|
_anim.SetTrigger("jumpTrigger");
|
||||||
|
_stateMachine.ChangeState(PlayerState.Jump);
|
||||||
|
_jumpReadyCoolTimer = _jumpReadyCool;
|
||||||
|
_ = Util.RunDelayed(0.1f, JumpAction, default);
|
||||||
|
|
||||||
|
_jumpCount++;
|
||||||
|
_stateMachine.RecordJump();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
public void DodgeInput(InputState inputState)
|
public void DodgeInput(InputState inputState)
|
||||||
{
|
{
|
||||||
// 구르기 가능한 상태일 때만
|
// 구르기 가능한 상태일 때만
|
||||||
@@ -262,31 +351,4 @@ public void DodgeInput(InputState inputState)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region 점프
|
|
||||||
public void JumpInput(InputState inputState)
|
|
||||||
{
|
|
||||||
if(_stateMachine.CanJump())
|
|
||||||
{
|
|
||||||
if (inputState == InputState.Started && _stateMachine.IsGrounded && _stateMachine.CurrentState != PlayerState.Jump && _jumpReadyCoolTimer <= 0f)
|
|
||||||
{
|
|
||||||
_anim.SetTrigger("jumpTrigger");
|
|
||||||
_stateMachine.ChangeState(PlayerState.Jump);
|
|
||||||
_jumpReadyCoolTimer = _jumpReadyCool;
|
|
||||||
_ = Util.RunDelayed(0.1f, JumpAction, default);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private void JumpAction()
|
|
||||||
{
|
|
||||||
_velocityY.y = Mathf.Sqrt(_jumpPower * -2f * _gravityValue);
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region
|
|
||||||
private void TickTimer()
|
|
||||||
{
|
|
||||||
if (_jumpReadyCoolTimer > 0) _jumpReadyCoolTimer -= Time.deltaTime; if (_jumpReadyCoolTimer < 0) _jumpReadyCoolTimer = 0f;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
public enum PlayerState { Idle, Walk, Run, Dodge, Jump, Fall, Attack, Charge, Hit, Dead }
|
public enum PlayerState { Idle, Walk, Run, Dodge, Jump, Fall, Attack, Charge, Hit, Dead, None }
|
||||||
@@ -9,14 +9,32 @@ public class PlayerStateMachine : MonoBehaviour
|
|||||||
public Action<PlayerState> OnStateChanged; // 상태가 변했을 때 다른 컴포넌트들이 알 수 있도록 이벤트 제공 (함수 포인터 활용)
|
public Action<PlayerState> OnStateChanged; // 상태가 변했을 때 다른 컴포넌트들이 알 수 있도록 이벤트 제공 (함수 포인터 활용)
|
||||||
|
|
||||||
public bool IsGrounded { get; set; } //상태 머신이기 때문에 계산은 여기서 안함 (플레이어가 갱신할 수 있도록 set 허용)
|
public bool IsGrounded { get; set; } //상태 머신이기 때문에 계산은 여기서 안함 (플레이어가 갱신할 수 있도록 set 허용)
|
||||||
|
public bool IsCloseToGround { get; set; }
|
||||||
public bool IsRunInputPressed { get; set; } //달리기키가 눌린 상태인가
|
public bool IsRunInputPressed { get; set; } //달리기키가 눌린 상태인가
|
||||||
public bool IsPossibleCharge { get; set; } //현재 차지 가능한 상태인가
|
public bool IsPossibleCharge { get; set; } //현재 차지 가능한 상태인가
|
||||||
|
public bool IsMoveCut { get; set; } //현재 이동 금지 상태인가
|
||||||
|
public bool IsJumpCool { get; set; } //현재 점프 쿨타임 상태인가
|
||||||
|
|
||||||
|
private int _jumpCount = 0;
|
||||||
|
private int _maxJumpCount = 1;
|
||||||
|
|
||||||
|
|
||||||
private void Awake()
|
private void Awake()
|
||||||
{
|
{
|
||||||
_anim = GetComponent<Animator>();
|
_anim = GetComponent<Animator>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
if (IsGrounded)
|
||||||
|
_jumpCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RecordJump()
|
||||||
|
{
|
||||||
|
if(_maxJumpCount > _jumpCount) _jumpCount++;
|
||||||
|
}
|
||||||
|
|
||||||
public void ChangeState(PlayerState newState)
|
public void ChangeState(PlayerState newState)
|
||||||
{
|
{
|
||||||
if (CurrentState == newState) return;
|
if (CurrentState == newState) return;
|
||||||
@@ -25,18 +43,27 @@ public void ChangeState(PlayerState newState)
|
|||||||
if (CurrentState == PlayerState.Dead) return;
|
if (CurrentState == PlayerState.Dead) return;
|
||||||
|
|
||||||
CurrentState = newState;
|
CurrentState = newState;
|
||||||
_anim.SetInteger("playerState", (int)newState);
|
|
||||||
|
|
||||||
OnStateChanged?.Invoke(newState);
|
OnStateChanged?.Invoke(newState);
|
||||||
|
|
||||||
//Debug.Log($"State Switched to: {newState}");
|
//Debug.Log($"State Switched to: {newState}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetMaxJumpCount(int maxCount)
|
||||||
|
{
|
||||||
|
_maxJumpCount = maxCount;
|
||||||
|
}
|
||||||
|
|
||||||
#region 상태확인용 헬퍼함수들
|
#region 상태확인용 헬퍼함수들
|
||||||
//지상 이동이 가능한가?
|
//지상 이동이 가능한가?
|
||||||
public bool CanMove() => IsGrounded && (CurrentState == PlayerState.Idle || CurrentState == PlayerState.Walk || CurrentState == PlayerState.Run);
|
public bool CanMove() => IsGrounded && !IsMoveCut && (CurrentState == PlayerState.Idle || CurrentState == PlayerState.Walk || CurrentState == PlayerState.Run);
|
||||||
//점프가 가능한 상태인가?
|
//점프가 가능한 상태인가?
|
||||||
public bool CanJump() => IsGrounded && (CurrentState == PlayerState.Idle || CurrentState == PlayerState.Walk || CurrentState == PlayerState.Run);
|
public bool CanJump()
|
||||||
|
{
|
||||||
|
bool jumpAlreadyMax = (_maxJumpCount <= _jumpCount);
|
||||||
|
|
||||||
|
return IsGrounded && !IsMoveCut && !jumpAlreadyMax && (CurrentState == PlayerState.Idle || CurrentState == PlayerState.Walk || CurrentState == PlayerState.Run);
|
||||||
|
}
|
||||||
//대쉬가 가능한 상태인가?
|
//대쉬가 가능한 상태인가?
|
||||||
public bool CanDodge()
|
public bool CanDodge()
|
||||||
{
|
{
|
||||||
@@ -49,13 +76,15 @@ public bool CanDodge()
|
|||||||
// 피격 상태이거나 죽었을 때 안 되게
|
// 피격 상태이거나 죽었을 때 안 되게
|
||||||
if (CurrentState == PlayerState.Hit || CurrentState == PlayerState.Dead) return false;
|
if (CurrentState == PlayerState.Hit || CurrentState == PlayerState.Dead) return false;
|
||||||
|
|
||||||
|
if (IsMoveCut) return false;
|
||||||
|
|
||||||
// 스태미나 시스템이 있다면 체크
|
// 스태미나 시스템이 있다면 체크
|
||||||
// if (CurrentStamina < DodgeCost) return false;
|
// if (CurrentStamina < DodgeCost) return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//공중에서 조작 가능한 상태인가?
|
//공중에서 조작 가능한 상태인가?
|
||||||
public bool CanControlInAir() => !IsGrounded && (CurrentState == PlayerState.Jump || CurrentState == PlayerState.Fall);
|
public bool CanControlInAir() => !IsGrounded && !IsMoveCut && (CurrentState == PlayerState.Jump || CurrentState == PlayerState.Fall);
|
||||||
//공격이 가능한 상태인가?
|
//공격이 가능한 상태인가?
|
||||||
public bool CanAttack()
|
public bool CanAttack()
|
||||||
{
|
{
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -89,16 +89,19 @@ AnimatorStateTransition:
|
|||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_Name:
|
m_Name:
|
||||||
m_Conditions: []
|
m_Conditions:
|
||||||
|
- m_ConditionMode: 4
|
||||||
|
m_ConditionEvent: speedRatio
|
||||||
|
m_EventTreshold: 0.1
|
||||||
m_DstStateMachine: {fileID: 0}
|
m_DstStateMachine: {fileID: 0}
|
||||||
m_DstState: {fileID: 0}
|
m_DstState: {fileID: 0}
|
||||||
m_Solo: 0
|
m_Solo: 0
|
||||||
m_Mute: 0
|
m_Mute: 0
|
||||||
m_IsExit: 1
|
m_IsExit: 1
|
||||||
serializedVersion: 3
|
serializedVersion: 3
|
||||||
m_TransitionDuration: 0.25
|
m_TransitionDuration: 0.2
|
||||||
m_TransitionOffset: 0
|
m_TransitionOffset: 0
|
||||||
m_ExitTime: 0.75
|
m_ExitTime: 0.65
|
||||||
m_HasExitTime: 1
|
m_HasExitTime: 1
|
||||||
m_HasFixedDuration: 1
|
m_HasFixedDuration: 1
|
||||||
m_InterruptionSource: 0
|
m_InterruptionSource: 0
|
||||||
@@ -131,8 +134,8 @@ AnimatorStateTransition:
|
|||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_Name:
|
m_Name:
|
||||||
m_Conditions:
|
m_Conditions:
|
||||||
- m_ConditionMode: 6
|
- m_ConditionMode: 1
|
||||||
m_ConditionEvent: playerState
|
m_ConditionEvent: IsCloseToGround
|
||||||
m_EventTreshold: 0
|
m_EventTreshold: 0
|
||||||
m_DstStateMachine: {fileID: 0}
|
m_DstStateMachine: {fileID: 0}
|
||||||
m_DstState: {fileID: -1500156996094094829}
|
m_DstState: {fileID: -1500156996094094829}
|
||||||
@@ -140,10 +143,10 @@ AnimatorStateTransition:
|
|||||||
m_Mute: 0
|
m_Mute: 0
|
||||||
m_IsExit: 0
|
m_IsExit: 0
|
||||||
serializedVersion: 3
|
serializedVersion: 3
|
||||||
m_TransitionDuration: 0.25
|
m_TransitionDuration: 0.02
|
||||||
m_TransitionOffset: 0
|
m_TransitionOffset: 0
|
||||||
m_ExitTime: 0.5
|
m_ExitTime: 0.5
|
||||||
m_HasExitTime: 1
|
m_HasExitTime: 0
|
||||||
m_HasFixedDuration: 1
|
m_HasFixedDuration: 1
|
||||||
m_InterruptionSource: 0
|
m_InterruptionSource: 0
|
||||||
m_OrderedInterruption: 1
|
m_OrderedInterruption: 1
|
||||||
@@ -175,7 +178,7 @@ AnimatorState:
|
|||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_Name: FeMale_Jump_Loop
|
m_Name: FeMale_Jump_Loop
|
||||||
m_Speed: 1
|
m_Speed: 2
|
||||||
m_CycleOffset: 0
|
m_CycleOffset: 0
|
||||||
m_Transitions:
|
m_Transitions:
|
||||||
- {fileID: -7114703549444218963}
|
- {fileID: -7114703549444218963}
|
||||||
@@ -234,7 +237,7 @@ AnimatorStateTransition:
|
|||||||
m_Mute: 0
|
m_Mute: 0
|
||||||
m_IsExit: 0
|
m_IsExit: 0
|
||||||
serializedVersion: 3
|
serializedVersion: 3
|
||||||
m_TransitionDuration: 0.25
|
m_TransitionDuration: 0.02
|
||||||
m_TransitionOffset: 0
|
m_TransitionOffset: 0
|
||||||
m_ExitTime: 0.75
|
m_ExitTime: 0.75
|
||||||
m_HasExitTime: 0
|
m_HasExitTime: 0
|
||||||
@@ -278,7 +281,7 @@ AnimatorStateTransition:
|
|||||||
m_Conditions:
|
m_Conditions:
|
||||||
- m_ConditionMode: 3
|
- m_ConditionMode: 3
|
||||||
m_ConditionEvent: speedRatio
|
m_ConditionEvent: speedRatio
|
||||||
m_EventTreshold: 0.7
|
m_EventTreshold: 0.6
|
||||||
m_DstStateMachine: {fileID: 0}
|
m_DstStateMachine: {fileID: 0}
|
||||||
m_DstState: {fileID: -8570500849040507336}
|
m_DstState: {fileID: -8570500849040507336}
|
||||||
m_Solo: 0
|
m_Solo: 0
|
||||||
@@ -301,10 +304,11 @@ AnimatorState:
|
|||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_Name: FeMale_Jump_End
|
m_Name: FeMale_Jump_End
|
||||||
m_Speed: 1
|
m_Speed: 2
|
||||||
m_CycleOffset: 0
|
m_CycleOffset: 0
|
||||||
m_Transitions:
|
m_Transitions:
|
||||||
- {fileID: -8459725543565529529}
|
- {fileID: -8459725543565529529}
|
||||||
|
- {fileID: 4699439757535628436}
|
||||||
m_StateMachineBehaviours: []
|
m_StateMachineBehaviours: []
|
||||||
m_Position: {x: 50, y: 50, z: 0}
|
m_Position: {x: 50, y: 50, z: 0}
|
||||||
m_IKOnFeet: 0
|
m_IKOnFeet: 0
|
||||||
@@ -329,12 +333,6 @@ AnimatorController:
|
|||||||
m_Name: Player_Gold_AnimController
|
m_Name: Player_Gold_AnimController
|
||||||
serializedVersion: 5
|
serializedVersion: 5
|
||||||
m_AnimatorParameters:
|
m_AnimatorParameters:
|
||||||
- m_Name: playerState
|
|
||||||
m_Type: 3
|
|
||||||
m_DefaultFloat: 0
|
|
||||||
m_DefaultInt: 0
|
|
||||||
m_DefaultBool: 0
|
|
||||||
m_Controller: {fileID: 9100000}
|
|
||||||
- m_Name: speedRatio
|
- m_Name: speedRatio
|
||||||
m_Type: 1
|
m_Type: 1
|
||||||
m_DefaultFloat: 0
|
m_DefaultFloat: 0
|
||||||
@@ -359,6 +357,12 @@ AnimatorController:
|
|||||||
m_DefaultInt: 0
|
m_DefaultInt: 0
|
||||||
m_DefaultBool: 0
|
m_DefaultBool: 0
|
||||||
m_Controller: {fileID: 9100000}
|
m_Controller: {fileID: 9100000}
|
||||||
|
- m_Name: IsCloseToGround
|
||||||
|
m_Type: 4
|
||||||
|
m_DefaultFloat: 0
|
||||||
|
m_DefaultInt: 0
|
||||||
|
m_DefaultBool: 0
|
||||||
|
m_Controller: {fileID: 9100000}
|
||||||
m_AnimatorLayers:
|
m_AnimatorLayers:
|
||||||
- serializedVersion: 5
|
- serializedVersion: 5
|
||||||
m_Name: Base Layer
|
m_Name: Base Layer
|
||||||
@@ -428,9 +432,9 @@ AnimatorStateTransition:
|
|||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_Name:
|
m_Name:
|
||||||
m_Conditions:
|
m_Conditions:
|
||||||
- m_ConditionMode: 6
|
- m_ConditionMode: 3
|
||||||
m_ConditionEvent: playerState
|
m_ConditionEvent: speedRatio
|
||||||
m_EventTreshold: 2
|
m_EventTreshold: 0.6
|
||||||
m_DstStateMachine: {fileID: 0}
|
m_DstStateMachine: {fileID: 0}
|
||||||
m_DstState: {fileID: 812379506000922009}
|
m_DstState: {fileID: 812379506000922009}
|
||||||
m_Solo: 0
|
m_Solo: 0
|
||||||
@@ -445,6 +449,34 @@ AnimatorStateTransition:
|
|||||||
m_InterruptionSource: 0
|
m_InterruptionSource: 0
|
||||||
m_OrderedInterruption: 1
|
m_OrderedInterruption: 1
|
||||||
m_CanTransitionToSelf: 1
|
m_CanTransitionToSelf: 1
|
||||||
|
--- !u!1101 &522452212933517361
|
||||||
|
AnimatorStateTransition:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_Name:
|
||||||
|
m_Conditions:
|
||||||
|
- m_ConditionMode: 4
|
||||||
|
m_ConditionEvent: speedRatio
|
||||||
|
m_EventTreshold: 0.6
|
||||||
|
- m_ConditionMode: 3
|
||||||
|
m_ConditionEvent: speedRatio
|
||||||
|
m_EventTreshold: 0.1
|
||||||
|
m_DstStateMachine: {fileID: 0}
|
||||||
|
m_DstState: {fileID: -8877422122749428159}
|
||||||
|
m_Solo: 0
|
||||||
|
m_Mute: 0
|
||||||
|
m_IsExit: 0
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TransitionDuration: 0.1
|
||||||
|
m_TransitionOffset: 0
|
||||||
|
m_ExitTime: 0.84042555
|
||||||
|
m_HasExitTime: 0
|
||||||
|
m_HasFixedDuration: 1
|
||||||
|
m_InterruptionSource: 0
|
||||||
|
m_OrderedInterruption: 1
|
||||||
|
m_CanTransitionToSelf: 1
|
||||||
--- !u!1102 &812379506000922009
|
--- !u!1102 &812379506000922009
|
||||||
AnimatorState:
|
AnimatorState:
|
||||||
serializedVersion: 6
|
serializedVersion: 6
|
||||||
@@ -458,6 +490,7 @@ AnimatorState:
|
|||||||
m_Transitions:
|
m_Transitions:
|
||||||
- {fileID: -1952985201289186596}
|
- {fileID: -1952985201289186596}
|
||||||
- {fileID: 9186944702478258436}
|
- {fileID: 9186944702478258436}
|
||||||
|
- {fileID: 522452212933517361}
|
||||||
m_StateMachineBehaviours: []
|
m_StateMachineBehaviours: []
|
||||||
m_Position: {x: 50, y: 50, z: 0}
|
m_Position: {x: 50, y: 50, z: 0}
|
||||||
m_IKOnFeet: 0
|
m_IKOnFeet: 0
|
||||||
@@ -670,9 +703,9 @@ AnimatorStateTransition:
|
|||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_Name:
|
m_Name:
|
||||||
m_Conditions:
|
m_Conditions:
|
||||||
- m_ConditionMode: 6
|
- m_ConditionMode: 3
|
||||||
m_ConditionEvent: playerState
|
m_ConditionEvent: speedRatio
|
||||||
m_EventTreshold: 2
|
m_EventTreshold: 0.6
|
||||||
m_DstStateMachine: {fileID: 0}
|
m_DstStateMachine: {fileID: 0}
|
||||||
m_DstState: {fileID: 812379506000922009}
|
m_DstState: {fileID: 812379506000922009}
|
||||||
m_Solo: 0
|
m_Solo: 0
|
||||||
@@ -698,9 +731,6 @@ AnimatorStateTransition:
|
|||||||
- m_ConditionMode: 4
|
- m_ConditionMode: 4
|
||||||
m_ConditionEvent: speedRatio
|
m_ConditionEvent: speedRatio
|
||||||
m_EventTreshold: 0.1
|
m_EventTreshold: 0.1
|
||||||
- m_ConditionMode: 6
|
|
||||||
m_ConditionEvent: playerState
|
|
||||||
m_EventTreshold: 0
|
|
||||||
m_DstStateMachine: {fileID: 0}
|
m_DstStateMachine: {fileID: 0}
|
||||||
m_DstState: {fileID: 8252589470091190605}
|
m_DstState: {fileID: 8252589470091190605}
|
||||||
m_Solo: 0
|
m_Solo: 0
|
||||||
@@ -715,6 +745,31 @@ AnimatorStateTransition:
|
|||||||
m_InterruptionSource: 0
|
m_InterruptionSource: 0
|
||||||
m_OrderedInterruption: 1
|
m_OrderedInterruption: 1
|
||||||
m_CanTransitionToSelf: 1
|
m_CanTransitionToSelf: 1
|
||||||
|
--- !u!1101 &4699439757535628436
|
||||||
|
AnimatorStateTransition:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_Name:
|
||||||
|
m_Conditions:
|
||||||
|
- m_ConditionMode: 3
|
||||||
|
m_ConditionEvent: speedRatio
|
||||||
|
m_EventTreshold: 0.1
|
||||||
|
m_DstStateMachine: {fileID: 0}
|
||||||
|
m_DstState: {fileID: -8570500849040507336}
|
||||||
|
m_Solo: 0
|
||||||
|
m_Mute: 0
|
||||||
|
m_IsExit: 0
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TransitionDuration: 0.2
|
||||||
|
m_TransitionOffset: 0
|
||||||
|
m_ExitTime: 0.65
|
||||||
|
m_HasExitTime: 1
|
||||||
|
m_HasFixedDuration: 1
|
||||||
|
m_InterruptionSource: 0
|
||||||
|
m_OrderedInterruption: 1
|
||||||
|
m_CanTransitionToSelf: 1
|
||||||
--- !u!1102 &5274542655692502972
|
--- !u!1102 &5274542655692502972
|
||||||
AnimatorState:
|
AnimatorState:
|
||||||
serializedVersion: 6
|
serializedVersion: 6
|
||||||
@@ -749,7 +804,7 @@ AnimatorState:
|
|||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_Name: FeMale_Jump_Start
|
m_Name: FeMale_Jump_Start
|
||||||
m_Speed: 1
|
m_Speed: 2
|
||||||
m_CycleOffset: 0
|
m_CycleOffset: 0
|
||||||
m_Transitions:
|
m_Transitions:
|
||||||
- {fileID: 8227715279690986525}
|
- {fileID: 8227715279690986525}
|
||||||
@@ -797,7 +852,7 @@ AnimatorStateTransition:
|
|||||||
m_Conditions:
|
m_Conditions:
|
||||||
- m_ConditionMode: 3
|
- m_ConditionMode: 3
|
||||||
m_ConditionEvent: speedRatio
|
m_ConditionEvent: speedRatio
|
||||||
m_EventTreshold: 0.3
|
m_EventTreshold: 0.1
|
||||||
m_DstStateMachine: {fileID: 0}
|
m_DstStateMachine: {fileID: 0}
|
||||||
m_DstState: {fileID: -8570500849040507336}
|
m_DstState: {fileID: -8570500849040507336}
|
||||||
m_Solo: 0
|
m_Solo: 0
|
||||||
@@ -823,9 +878,6 @@ AnimatorStateTransition:
|
|||||||
- m_ConditionMode: 4
|
- m_ConditionMode: 4
|
||||||
m_ConditionEvent: speedRatio
|
m_ConditionEvent: speedRatio
|
||||||
m_EventTreshold: 0.1
|
m_EventTreshold: 0.1
|
||||||
- m_ConditionMode: 6
|
|
||||||
m_ConditionEvent: playerState
|
|
||||||
m_EventTreshold: 0
|
|
||||||
m_DstStateMachine: {fileID: 0}
|
m_DstStateMachine: {fileID: 0}
|
||||||
m_DstState: {fileID: 8252589470091190605}
|
m_DstState: {fileID: 8252589470091190605}
|
||||||
m_Solo: 0
|
m_Solo: 0
|
||||||
@@ -848,9 +900,9 @@ AnimatorStateTransition:
|
|||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_Name:
|
m_Name:
|
||||||
m_Conditions:
|
m_Conditions:
|
||||||
- m_ConditionMode: 6
|
- m_ConditionMode: 3
|
||||||
m_ConditionEvent: playerState
|
m_ConditionEvent: speedRatio
|
||||||
m_EventTreshold: 1
|
m_EventTreshold: 0.1
|
||||||
m_DstStateMachine: {fileID: 0}
|
m_DstStateMachine: {fileID: 0}
|
||||||
m_DstState: {fileID: -8877422122749428159}
|
m_DstState: {fileID: -8877422122749428159}
|
||||||
m_Solo: 0
|
m_Solo: 0
|
||||||
@@ -872,16 +924,19 @@ AnimatorStateTransition:
|
|||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_Name:
|
m_Name:
|
||||||
m_Conditions: []
|
m_Conditions:
|
||||||
|
- m_ConditionMode: 4
|
||||||
|
m_ConditionEvent: velocityY
|
||||||
|
m_EventTreshold: 0
|
||||||
m_DstStateMachine: {fileID: 0}
|
m_DstStateMachine: {fileID: 0}
|
||||||
m_DstState: {fileID: -5656908960061501505}
|
m_DstState: {fileID: -5656908960061501505}
|
||||||
m_Solo: 0
|
m_Solo: 0
|
||||||
m_Mute: 0
|
m_Mute: 0
|
||||||
m_IsExit: 0
|
m_IsExit: 0
|
||||||
serializedVersion: 3
|
serializedVersion: 3
|
||||||
m_TransitionDuration: 0.25
|
m_TransitionDuration: 0.15
|
||||||
m_TransitionOffset: 0
|
m_TransitionOffset: 0
|
||||||
m_ExitTime: 0.75
|
m_ExitTime: 0.5
|
||||||
m_HasExitTime: 1
|
m_HasExitTime: 1
|
||||||
m_HasFixedDuration: 1
|
m_HasFixedDuration: 1
|
||||||
m_InterruptionSource: 0
|
m_InterruptionSource: 0
|
||||||
@@ -958,8 +1013,8 @@ AnimatorStateMachine:
|
|||||||
m_StateMachineTransitions: {}
|
m_StateMachineTransitions: {}
|
||||||
m_StateMachineBehaviours: []
|
m_StateMachineBehaviours: []
|
||||||
m_AnyStatePosition: {x: -410, y: 230, z: 0}
|
m_AnyStatePosition: {x: -410, y: 230, z: 0}
|
||||||
m_EntryPosition: {x: -200, y: -270, z: 0}
|
m_EntryPosition: {x: -240, y: -380, z: 0}
|
||||||
m_ExitPosition: {x: 620, y: 230, z: 0}
|
m_ExitPosition: {x: 680, y: -10, z: 0}
|
||||||
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
|
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
|
||||||
m_DefaultState: {fileID: 8252589470091190605}
|
m_DefaultState: {fileID: 8252589470091190605}
|
||||||
--- !u!1107 &9185882794967473588
|
--- !u!1107 &9185882794967473588
|
||||||
@@ -995,9 +1050,6 @@ AnimatorStateTransition:
|
|||||||
- m_ConditionMode: 4
|
- m_ConditionMode: 4
|
||||||
m_ConditionEvent: speedRatio
|
m_ConditionEvent: speedRatio
|
||||||
m_EventTreshold: 0.1
|
m_EventTreshold: 0.1
|
||||||
- m_ConditionMode: 6
|
|
||||||
m_ConditionEvent: playerState
|
|
||||||
m_EventTreshold: 0
|
|
||||||
m_DstStateMachine: {fileID: 0}
|
m_DstStateMachine: {fileID: 0}
|
||||||
m_DstState: {fileID: 8252589470091190605}
|
m_DstState: {fileID: 8252589470091190605}
|
||||||
m_Solo: 0
|
m_Solo: 0
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user