이동에서 작성한 스트립트에 점프기능을 구현해보았습니다.
점프도 기본적으로는 이동과 같다고 생각했습니다.
GameObject에 Rigidbody컴포넌트를 추가해 중력를 적용해주고 이동에서 이용했던 방식을 응용했습니다.
1.Transform.Translate이용
--------------
if (Input.GetKey(KeyCode.Space))
{
transform.Translate(Vector3.up * Time.deltaTime *100 );
}
중력이 센지 100정도는 곱해줘야 어느정도 점프를 합니다.
Position을 직접이동해서인지 어색한 점프입니다.
--------------
2.RigidBody.Verocityd이용
--------------
private Rigidbody rb;
void Start () {
rb = GetComponent<Rigidbody>();
}
if (Input.GetKey(KeyCode.Space))
{
rb.velocity = new Vector3(0, 5, 0);
}
5정도 설정하니 꽤 괜찮은 점프입니다.
--------------
3.RigidBody.AddForce이용
--------------
private Rigidbody rb;
void Start () {
rb = GetComponent<Rigidbody>();
}
if (Input.GetKey(KeyCode.Space))
{
rb.AddForce = new Vector3(0, 100, 0);
}
100정도 설정하니 꽤 괜찮은 점프입니다.
--------------
실제작동해보니 버그가 발견되었습니다.
스페이스키를 계속 누르고 있으면 무한 점프가 가능합니다.
Plain에 닿았을 때만 점프가 작동하도록 해야할것 같습니다.
--------------
private bool isJumping=false; //점프유무기록
.
..
...
if (Input.GetKey(KeyCode.Space) && isJumping==false)
{
rb.AddForce = new Vector3(0, 100, 0);
isJumping=true;
}
--------------
여기까지 하면 단 1번만 점프가 가능합니다.
Plain에 닿았을때 isJumping=false로 변경이 필요합니다.
두가지 방법을 찾았습니다.
1.OnCollisionEnter이용
--------------
Plain:Inspector:Tag에서 태그를 설정합니다. Ground로 설정했습니다.
private void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.CompareTag("Ground"))
{
isJumping = false;
}
}
--------------
https://docs.unity3d.com/ScriptReference/Collider.OnCollisionEnter.html
2.Physics.Linecast이용
--------------
Plain:Inspector:Layer에서 레이어를 설정합니다. Ground로 설정했습니다.
isJumping= Physics.Linecast(transform.position, transform.position - transform.up * 1.1f, LayerMask.GetMask("Ground") );
를
if (Input.GetKey(KeyCode.Space) && isJumping==false)
위에 추가했습니다.
점프처리후 isJumping=true; 는 없어도 되겠네요.
--------------
https://docs.unity3d.com/ScriptReference/Physics.Linecast.html