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