유니티:캐릭터 이동: 두 판 사이의 차이
(→이동) |
(→이동) |
||
26번째 줄: | 26번째 줄: | ||
==이동== | ==이동== | ||
=== 벡터 === | |||
이동을 구현하기 위해선 Rigidbody의 Velocity에 변화를 주어야 한다. 이는 Vector3 형태이기에 그 형태에 맞는 값을 지정해주어야 한다. | |||
=== 코드구현 === | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public class PalyerMove : MonoBehaviour{ | public class PalyerMove : MonoBehaviour{ | ||
public Rigidbody playerRigidbody; // 플레이어의 물리. | public Rigidbody playerRigidbody; // 플레이어의 물리. | ||
public float playerSpeed; // 이동속도. | public float playerSpeed; // 이동속도. | ||
</syntaxhighlight> | </syntaxhighlight>이동을 구현하기 위해 Rigidbody의 addForce를 사용하거나 Velocity를 사용하는데, addForce는 힘을 가하기 때문에 관성의 영향을 그대로 받고, Velocity는 속력을 즉각 반영한다는 특징이 있다. | ||
=== 코드구현이 끝난 후 === | ===코드구현이 끝난 후=== | ||
인스펙터 창에 나타난 PlayerRigidbody에 컴포넌트를 드래그&드롭 해주어 물리를 적용한다. | Rigidbody를 public으로 지정한 경우, 인스펙터 창에 나타난 PlayerRigidbody에 컴포넌트를 드래그&드롭 해주어 물리를 적용한다. | ||
===애니메이션 조작=== | ===애니메이션 조작=== |
2021년 8월 10일 (화) 02:41 판
- 유니티:개요
- 유니티:기본 조작
- 유니티:카메라
- 유니티:오브젝트
- 유니티:코딩기초
- 유니티:UI
- 유니티:게임 내 화면
- 유니티:플레이어
- 유니티:맵
- 유니티:씬
- 유니티:몬스터
- 유니티:아이템
- 유니티:음향
- 유니티:빌드
- 유니티:VR
- 유니티:팁
개요
스크립트를 만든다.
public변수로 두면 인스펙터에서 편집할 수 있다.
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))//좌측에 대한 스피드
...
일반적으로 타이밍이 중요한 단발적인 키 입력은 Update에서 다룬다.(프레임이 더 촘촘해)
현실적인 움직임.
rigidbody에서 Linear Drag는 공기저항의 역할을 한다.(접촉하지 않을 때의 저항)
이동
벡터
이동을 구현하기 위해선 Rigidbody의 Velocity에 변화를 주어야 한다. 이는 Vector3 형태이기에 그 형태에 맞는 값을 지정해주어야 한다.
코드구현
public class PalyerMove : MonoBehaviour{
public Rigidbody playerRigidbody; // 플레이어의 물리.
public float playerSpeed; // 이동속도.
이동을 구현하기 위해 Rigidbody의 addForce를 사용하거나 Velocity를 사용하는데, addForce는 힘을 가하기 때문에 관성의 영향을 그대로 받고, Velocity는 속력을 즉각 반영한다는 특징이 있다.
코드구현이 끝난 후
Rigidbody를 public으로 지정한 경우, 인스펙터 창에 나타난 PlayerRigidbody에 컴포넌트를 드래그&드롭 해주어 물리를 적용한다.
애니메이션 조작
방향에 따라 캐릭터가 바라보는 곳을 바꾸게끔 만들어야 한다.
점프
단발적인 조작이기에, Update에 두는 편이 좋다. 아래와 같은 형식으로 코딩한다.
if(Input.GetButtonDown("Jump"))//점프키를 받으면..
rigid.AddForce(벡터.up * jumpPower, 모드) //위에 jumpPower를 미리 정의해주어야 한다.
애니메이션객체.SetBool("애니매개변수값", 변경할값);
점프에 해당하는 애니메이션도 넣어주어야 할 것이다.
점프의 끝
점프가 끝나고 애니메이션을 끝내주고 기본적인 Idle상태로 돌려주어야 한다. 일반적으로 onCollisionOn을 사용하지만, 레이캐스트도 가능하다.
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); //땅에 닿았으니 점프관련 변수를 바꿔준다.
}
캐릭터가 아래로 내려올 때에만 레이를 쏘게끔 만들어도 괜찮겠다. if(rigid.velocity.y<0) 등으로.
무한 점프 막기
점프가 무한정 되는 상황을 막기 위해 다른 처리가 더 필요해진다.
맨 위의 Input 부분에 if의 조건으로 && !애니객체.GetBool("애니매개변수")
를 넣어주어 점프상태가 아님을 파악하여 점프키를 먹도록 하는 게 좋겠다.