안녕하세요! 초보 새내기 개발자입니다.
개인적으로는 게임 개발이 삶에서 포기하고 싶지 않은 마지막 도전이예요.... 게임개발에 관련한 모든 것이 처음이라 많이 헤매고 있어요
이런 화면의 액션 RPG 게임을 만드는데요.
오른쪽 하단의 대쉬버튼을 누르면
기존의 rotation값을 향해, "오버워치의 맥크리"처럼 구르기를 구현하고 싶어요.
구르기 애니메이션은 블렌더로 어떻게 만들어서 넣긴 했는데....
빠르게 앞으로 이동할 때, 부드럽게 움직이지 않고, 마치 순간이동처럼 움직이더군요..
2주동안 고민중이예요!
앞으로 나올 문제의... "float dashSpeed = 4f"로 했을 때 구르기 애니메이션 자체는 자연스럽지만, 이동거리가 좀 늘어났으면 좋겠다는 생각이구요...
이하는 스크립트 입니다. 좋은 솔루션이 있다면 도움 부탁드려요!
public class PlayerControl : MonoBehaviour
{
protected Animator avatar; //메카님 불러오기
[Header("Player Movement")]
public float walkSpeed = 4f; // 걷기속도
float lastAttackTime, lastSkillTime, lastDashTime; // 각 스킬 쿨다운 등을 위한 설정
public bool dashing = false; // 대쉬 상태
public float dashSpeed = 40f; // 대쉬 스피드
private float dashTime; // 대쉬 쿨타임
void Start()
{
avatar = GetComponent<Animator>();
}
float h, v; // h는 호라이즌 , v는 버티컬 방향 컨트롤러
public void OnStickChanged(Vector2 stickPos) //화면 왼쪽하단 스틱 구현입니다.
{
h = stickPos.x;
v = stickPos.y;
}
private void Update()
{
if (avatar)
{
float back = 1f;
if (v < 0f) back = -1f;
//애니메이터에 전달 값 == 속도
avatar.SetFloat("Speed", (h * h + v * v));
Rigidbody rigidbody = GetComponent<Rigidbody>();
if (rigidbody)
{
Vector3 speed = rigidbody.velocity;
speed.x = walkSpeed * h;
speed.z = walkSpeed * v;
rigidbody.velocity = speed;
if (h != 0f && v != 0f)
{
//컨트롤러에서 손떼도 방향 그대로
transform.rotation = Quaternion.LookRotation(new Vector3(h, 0f, v));
}
}
}
}
//---- 공격, 스킬 스크립트 중략...----
//대쉬버튼 터치 시
public void OnDashDown()
{
//대쉬 트리거는 대쉬를 누른 뒤 일정 시간 후 작동 가능..
if (Time.time - lastDashTime > 1f)
{
this.transform.Translate(new Vector3 (0f, 0f, dashSpeed * Time.deltaTime));
//(문제 발생지점) AddForce, Transform.position 등 이동관련 스크립트를 넣어보았는데, 똑같은현상 == 부드럽게 움직이지 않고, 1 프레임만에 일정 거리 이동.
lastDashTime = Time.time;
dashing = true;
avatar.SetTrigger("Dash");
}
}
public void OnDashUp()
{
dashing = false;
}
}
질문이 제대로 형식을 갖추었는지도 모르겠네요 ㅠㅠ
꼭 ! 도움 부탁드립니다!
__________________________________________________________
제가 자의적으로 여러 스크립트 참고물을 섞다보니 문제가 생기네요 ㅠㅠ
devkorea의 친절한 "곤짱"이란 닉네임을 가진 분께서
//
버튼 이벤트 자체가 프레임을 한 번 호출하고 끝내버리는 그런 이벤트 입니다.
public void OnDashDown()
{
dashing = true;
}
이렇게 해주시고, 업데이트 함수를 수정할 필요가 있을 것 같습니다.
private void Update(){
if (Time.time - lastDashTime > 1f && dashing == true)
{
this.transform.Translate(new Vector3 (0f, 0f, dashSpeed * Time.deltaTime));
lastDashTime = Time.time;
avatar.SetTrigger("Dash");
dashing = false;
}
}
// 라는 코멘트를 달아주셨어요.
증상자체는 구르기 애니메이션 말고, Movement(즉 transform함수를 통한 이동속도와 거리)가 단 1 프레임만 호출된다는 문제로 생각되는데요.
제가 생각하는 해결 방법은
1. while문을 이용한 반복호출
2. OnDashDown 이하, if 조건문 이하의 bool dashing이 true에서 false로 호출되는 시간을 조금 뒤로 미루는 방법
두가지를 생각하고 있습니다만, 프로그래밍 및 C#언어에 완전 생초보라 ㅠㅠㅠㅠㅠㅠㅠㅠ 스크립트를 짜는게 어렵네요.'
질문에 사족이 길었습니다.
도움 부탁드려요 ㅠㅠ
긴글 읽어주셔서 감사합니다!