728x90
반응형
애니메이터에 회피를 추가해줍니다.
닷지 파타메터는 트리거로 해줍니다.
애니메이터 설정이 끝났으니 스크립트를 작성해줍니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public float speed;
float hAxis;
float vAxis;
bool wDown;
bool jDown;
bool isJump;
bool isDodge;
Vector3 moveVec;
Rigidbody rigid;
Animator anim;
void Awake()
{
rigid = GetComponent<Rigidbody>();
anim = GetComponentInChildren<Animator>();
}
void Update()
{
GetInput();
Move();
Turn();
Jump();
Dodge();
}
void GetInput()
{
hAxis = Input.GetAxisRaw("Horizontal");
vAxis = Input.GetAxisRaw("Vertical");
wDown = Input.GetButton("Walk");
jDown = Input.GetButtonDown("Jump");
}
void Move()
{
moveVec = new Vector3(hAxis, 0, vAxis).normalized;
transform.position += moveVec * speed * (wDown ? 0.3f : 1f) * Time.deltaTime;
anim.SetBool("isRun", moveVec != Vector3.zero);
anim.SetBool("isWalk", wDown);
}
void Turn()
{
transform.LookAt(transform.position + moveVec);
}
void Jump()
{
if (jDown && moveVec == Vector3.zero && !isJump && !isDodge)
{
rigid.AddForce(Vector3.up * 15, ForceMode.Impulse);
anim.SetBool("isJump", true);
anim.SetTrigger("doJump");
isJump = true;
}
}
void Dodge()
{
if (jDown && moveVec != Vector3.zero && !isJump && !isDodge)
{
speed *= 2;
anim.SetTrigger("doDodge");
isDodge = true;
Invoke("DodgeOut", 0.4f);
}
}
void DodgeOut()
{
speed *= 0.5f;
isDodge = false;
}
void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.tag == "Floor")
{
anim.SetBool("isJump", false);
isJump = false;
}
}
}
회피의 이동키는 Jump와 공유합니다.
위로 힘이 가해지던 점프와 달리 이동속도가 2배로 변하며 회피 애니메이션을 재생합니다.
점프 조건에 회피중이 아닐 때, 회피 조건에 회피 중이 아닐 때를 추가합니다.
이동 중 점프키를 누르면 회피 동작이 나오나 애니메이션 속도가 느리고
재사용 간격이 너무 짧아 연타하면 캐릭터 애니메이션이 정상적으로 나오지 못합니다.
애니메이션 속도를 높이고 Invoke()에서 지연시간을 늘립니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public float speed;
float hAxis;
float vAxis;
bool wDown;
bool jDown;
bool isJump;
bool isDodge;
Vector3 moveVec;
Rigidbody rigid;
Animator anim;
void Awake()
{
rigid = GetComponent<Rigidbody>();
anim = GetComponentInChildren<Animator>();
}
void Update()
{
GetInput();
Move();
Turn();
Jump();
Dodge();
}
void GetInput()
{
hAxis = Input.GetAxisRaw("Horizontal");
vAxis = Input.GetAxisRaw("Vertical");
wDown = Input.GetButton("Walk");
jDown = Input.GetButtonDown("Jump");
}
void Move()
{
moveVec = new Vector3(hAxis, 0, vAxis).normalized;
transform.position += moveVec * speed * (wDown ? 0.3f : 1f) * Time.deltaTime;
anim.SetBool("isRun", moveVec != Vector3.zero);
anim.SetBool("isWalk", wDown);
}
void Turn()
{
transform.LookAt(transform.position + moveVec);
}
void Jump()
{
if (jDown && moveVec == Vector3.zero && !isJump && !isDodge)
{
rigid.AddForce(Vector3.up * 15, ForceMode.Impulse);
anim.SetBool("isJump", true);
anim.SetTrigger("doJump");
isJump = true;
}
}
void Dodge()
{
if (jDown && moveVec != Vector3.zero && !isJump && !isDodge)
{
speed *= 2.5f;
anim.SetTrigger("doDodge");
isDodge = true;
Invoke("DodgeOut", 0.5f);
}
}
void DodgeOut()
{
speed *= 0.4f;
isDodge = false;
}
void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.tag == "Floor")
{
anim.SetBool("isJump", false);
isJump = false;
}
}
}
회피 동작시 이동속도, 재사용 지연시간 등은 추후에 추가적으로 조정합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public float speed;
float hAxis;
float vAxis;
bool wDown;
bool jDown;
bool isJump;
bool isDodge;
Vector3 moveVec;
Vector3 dodgeVec;
Rigidbody rigid;
Animator anim;
void Awake()
{
rigid = GetComponent<Rigidbody>();
anim = GetComponentInChildren<Animator>();
}
void Update()
{
GetInput();
Move();
Turn();
Jump();
Dodge();
}
void GetInput()
{
hAxis = Input.GetAxisRaw("Horizontal");
vAxis = Input.GetAxisRaw("Vertical");
wDown = Input.GetButton("Walk");
jDown = Input.GetButtonDown("Jump");
}
void Move()
{
moveVec = new Vector3(hAxis, 0, vAxis).normalized;
if (isDodge)
moveVec = dodgeVec;
transform.position += moveVec * speed * (wDown ? 0.3f : 1f) * Time.deltaTime;
anim.SetBool("isRun", moveVec != Vector3.zero);
anim.SetBool("isWalk", wDown);
}
void Turn()
{
transform.LookAt(transform.position + moveVec);
}
void Jump()
{
if (jDown && moveVec == Vector3.zero && !isJump && !isDodge)
{
rigid.AddForce(Vector3.up * 15, ForceMode.Impulse);
anim.SetBool("isJump", true);
anim.SetTrigger("doJump");
isJump = true;
}
}
void Dodge()
{
if (jDown && moveVec != Vector3.zero && !isJump && !isDodge)
{
dodgeVec = moveVec;
speed *= 2.5f;
anim.SetTrigger("doDodge");
isDodge = true;
Invoke("DodgeOut", 0.5f);
}
}
void DodgeOut()
{
speed *= 0.4f;
isDodge = false;
}
void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.tag == "Floor")
{
anim.SetBool("isJump", false);
isJump = false;
}
}
}
회피 중 방향이 전환되는걸 막기 위해 dodgeVec을 선언하고
Move()에 조건을 걸어 회피 중 방향이 고정되게 합니다.
728x90
반응형
'유니티 > AA(3D 쿼터뷰 액션 게임)' 카테고리의 다른 글
AA(7) - 캐릭터 변경하기 (0) | 2021.09.10 |
---|---|
AA(5) - 아이템 만들기 (0) | 2021.09.08 |
AA(3) - 플레이어 점프 (0) | 2021.08.30 |
AA(2) - 코드 정리 (0) | 2021.08.30 |
AA(1) - 플레이어 이동 (0) | 2021.08.29 |