유니티:캐릭터 이동
편집하기
둘러보기로 이동
검색으로 이동
경고:
로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다.
로그인
하거나
계정을 생성하면
편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.
스팸 방지 검사입니다. 이것을 입력하지
마세요
!
{{유니티}} ==개요== 스크립트를 만든다. public변수로 두면 인스펙터에서 편집할 수 있다.<syntaxhighlight lang="c#"> public class Move : MonoBehaviour{ public float maxSpeed; Rigidbody rigid; void FixedUpdate(){ float h=Input.GetAxisRaw("Horizontal"); rigid.AddForce(벡터, 모드) if(rigid.velocity.x > masSpeed)//우측에 대한 스피드. rigid.velocity=new Vector3(masSpeed, rigid.velocity.y); else if(rigid.velocity.x < masSpeed*(-1))//좌측에 대한 스피드 ... </syntaxhighlight>일반적으로 타이밍이 중요한 단발적인 키 입력은 Update에서 다룬다.(프레임이 더 촘촘해) ===현실적인 움직임.=== rigidbody에서 Linear Drag는 공기저항의 역할을 한다.(접촉하지 않을 때의 저항) <br /> ==이동== ===벡터=== 이동을 구현하기 위해선 Rigidbody의 Velocity에 변화를 주어야 한다. 이는 Vector3 형태이기에 그 형태에 맞는 값을 지정해주어야 한다. ===코드구현=== <syntaxhighlight lang="c#"> public class PalyerMove : MonoBehaviour{ public Rigidbody playerRigidbody; // 플레이어의 물리. public float playerSpeed; // 이동속도. </syntaxhighlight>이동을 구현하기 위해 Rigidbody의 addForce를 사용하거나 Velocity를 사용하는데, addForce는 힘을 가하기 때문에 관성의 영향을 그대로 받고, Velocity는 속력을 즉각 반영한다는 특징이 있다. ===코드구현이 끝난 후=== Rigidbody를 public으로 지정한 경우, 인스펙터 창에 나타난 PlayerRigidbody에 컴포넌트를 드래그&드롭 해주어 물리를 적용한다. ===애니메이션 조작=== 방향에 따라 캐릭터가 바라보는 곳을 바꾸게끔 만들어야 한다. ==점프== 단발적인 조작이기에, Update에 두는 편이 좋다. 아래와 같은 형식으로 코딩한다. 오디오 컴포넌트에 오디오 소스 따위를 넣어주는 작업, 애니메이션 작업 등은 이미 마쳤다고 가정한다.<syntaxhighlight lang="c#"> privarte Rigidbody playerRigidbody; // 컴포넌트를 받을 변수를 만들어둔다. private Animator animator; // 애니메이터를 받을 변수를 만들어둔다. private AudioSource playerAudio; // 재생할 오디오를 받을 변수. private int jumpCount = 0; // 점프 횟수를 기록하기 위한 변수. public int jumpForce; // 점프력을 기록하기 위한 변수. private bool isGrounded = false; // 땅에 접해있는가 여부를 결정하는 변수 public AudioClip 사용할 오디오 클립; // 나중에 사용할 오디오클립을 담아둬서 바꾸어 사용할 수 있다. private void Start() { playerRigidbody = GetComponent<Rigidbody>(); // 플레이어의 리지드바디를 가져온다. animator = GetComponent<Animator>(); // 애니메이터를 가져온다. playerAudio = GetComponent<AudioSource>(); // 오디오소스를 가져온다. } private void Update() { if(Input.GetButtonDown("Jump") && jumpCount<2 ) { // 점프키를 받고, 점프가 2회 이하이면, jumpCount++; // 점프횟수를 추가하고.. playerRigidbody.velocity = Vector3.zero; // 속도를 0으로 만든다.(게임을 위한 장치) playerRigidbody.AddForce(new Vector3(0,jumpForce,0)); // 점프력을 더한다. playerAudio.Play(); // 효과음을 실행한다. } // 점프 도중에 버튼을 떼면 점프를 낮게 하는 걸 구현하고자 할 때 다음의 조건문을 넣는다. else if (Input.GetButtonUp("Jump") && playerRigidbody.velocity.y>0) // 점프 도중에 버튼을 떼면.. { // 위로 향하는 속도가 있을 때에만 속력을 줄인다. playerRigidbody.velocity = playerRigidbody.velocity*0.5f // 현재 속도를 반으로 줄인다. } } private void OnTriggerEnter(Collider other) { // 땅에 닿았을 때를 구현한 것. if (other.tag == "Ground") // 땅에 닿았을 때.. { if (other.contacts[0].normal.y > 0.7f) { // 혹은, 무언가와의 접촉이 y값이 0.7 이상 되게끔 이루어졌을 때. isGrounded = true; // 땅에 닿았음을 알려주고.. jumpCount = 0; // 점프횟수를 초기화한다. animator.SetBool("애니매개변수값", isGrounded); // 애니메이션 매개변수에 바닥판정을 전달한다. } } } private void OnCollisionExit(Collider other) { // 땅에서 떨어졌을 때를 구현한 것. isGrounded = false; animator.SetBool("애니매개변수값", isGrounded); // 애니메이션 매개변수에 바닥판정을 전달한다. } </syntaxhighlight>점프에 해당하는 애니메이션도 넣어주어야 할 것이다. ===점프의 끝=== 점프가 끝나고 애니메이션을 끝내주고 기본적인 Idle상태로 돌려주어야 한다. 일반적으로 onCollisionOn을 사용하지만, 레이캐스트도 가능하다.<syntaxhighlight lang="c#"> void FixedUpdate() //시작점, 방향, 레이의 색을 정해준다.(없어도 됨. 보기 쉽게 만들어준 것일 뿐) Debug.DrawRay(rigid.position, Vector3.down, new Collor(색값)); //에디터 상에서만 Ray를 그려주는 함수이다. //해당 거리 안에 들어오면 collider에 내용물이 담긴다. RaycastHit rayHit=Physics.Raycast(rigid.position, Vector3.down, 거리, LayerMask.Getmast("Floor")); //그러나, 레이는 한 오브젝트에 맞으면 관통이 안된다. //이 문제를 해결하기 위해 레이어를 이용한다. Floor 등의 이름으로 레이어를 만든다. //마지막 인자는 닿은 레이어를 반환한다는 의미이다. if(rayHit.collider != null){ if(rayHIt.distance <길이f){ 애니메이션객체명.SetBool("애니매개변수", false); //땅에 닿았으니 점프관련 변수를 바꿔준다. } </syntaxhighlight>캐릭터가 아래로 내려올 때에만 레이를 쏘게끔 만들어도 괜찮겠다. if(rigid.velocity.y<0) 등으로. <br /> ===무한 점프 막기=== 점프가 무한정 되는 상황을 막기 위해 다른 처리가 더 필요해진다. 맨 위의 Input 부분에 if의 조건으로 <code>&& !애니객체.GetBool("애니매개변수")</code> 를 넣어주어 점프상태가 아님을 파악하여 점프키를 먹도록 하는 게 좋겠다.
요약:
학교의 모든 지식. SMwiki에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는
학교의 모든 지식. SMwiki:저작권
문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.
저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소
편집 도움말
(새 창에서 열림)
이 문서에서 사용한 틀:
틀:유니티
(
편집
)
둘러보기 메뉴
개인 도구
로그인하지 않음
토론
기여
로그인
이름공간
문서
토론
한국어
보기
읽기
편집
원본 편집
역사 보기
더 보기
검색
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
도구
여기를 가리키는 문서
가리키는 글의 최근 바뀜
특수 문서 목록
문서 정보