EasyCastleUNITY

구름 오르기 본문

유니티 기초

구름 오르기

EasyCastleT 2023. 8. 2. 18:06

시작 화면

설명

화살표 왼쪽 오른쪽 키를 통해 움직이고 Space 키를 통해 점프를 한다. 

점프를 통해 깃발에 도달하면 Clear하는 간단한 게임이다. 

---구현 주요 포인트---

1.고양이와 깃발에 부딫힘은 OnTriggerEnter2D 메서드를 통해 구현하였다.

2. 처음 만들때, 점프가 여러번 가능한 문제점이 있었다. 

이를 해결하기 위해  OnCollisionEnter2D와 flag를 사용하였다.

구름 GameObject의 tag를 Cloud로 변경하여, 구름에 닿으면 jump를 다시 실행할 수 있도록 하였다. 

점프 기능 부분
구름과 충돌하면 다시 점프할 수 있도록 함

https://funfunhanblog.tistory.com/14

 

유니티) 캐릭터 점프 구현하기 (AddForce) Roll a Ball #3 점프 한번만 하기 (GetKeyDown)

캐릭터 점프구현 이번에도 역시나 Roll a Ball을 활용한다. 캐릭터 점프는 실제 위치값을 움직이는 Translate보다는 물리적 힘을 위로 주어서 튀어 오르는듯한 느낌을 주는 AddForce를 이용하는게 좋아

funfunhanblog.tistory.com

이 블로그를 참고하여 만들었다. 

3. 고양이의 맵 탈출

점프를 하다보면 고양이가 맵 밖으로 나가는 문제점이 있었다.

이를 해결하기 위해 Clamp를 사용하여, 이동 범위를 제한하였다.

4. 카메라의 고양이 따라감 

점프하는 고양이를 카메라가 따라가도록 하였다. 

카메라가 맵 밖을 렌더링 하면 안되므로, 카메라가 움직일 수 있는 좌표를 제한하였다. (Clamp 이용)

----전체적인 코드----

CatController: 고양이의 움직임을 담당하는 클래스, 고양이의 충돌, 점프 제한, 클리어 씬으로의 전환 등등의 기능을 가짐

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class CatController : MonoBehaviour
{
    private Rigidbody2D rBody2D;
    public float jumpForce = 600f; //점프하는 힘
    public float moveForce = 10f; //이동하는 힘
    private int jumpCount;
    private bool isCloud;
    private Animator anim;
    // Start is called before the first frame update
    void Start()
    {
        this.rBody2D = this.GetComponent<Rigidbody2D>();
        this.anim = GetComponent<Animator>();
        this.jumpCount = 1; //점프 가능 횟수 
        
    }

    // Update is called once per frame
    void Update()
    {
        this.transform.position = ClampPosition(this.transform.position);
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if(jumpCount == 1)
            {
                //점프한다. 
                //this.rBody2D.AddForce(방향 * 힘);
                this.rBody2D.AddForce(Vector2.up * this.jumpForce);
                
                jumpCount = 0; //점프한 순간 0이되어서 다시 점프 불가능 
            } 
        }
        //-1 0 1 (방향) -1:왼 0: 안움직임 1:오른
        int dirX = 0;
        if(Input.GetKey(KeyCode.LeftArrow))
        {
            dirX = -1;
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            dirX = 1;
        }
        //절대값 
        float speedX = Mathf.Abs(this.rBody2D.velocity.x);
       
        if(speedX < 2.0f)
        {
            //AddForce는 계속 힘이 누적 
            this.rBody2D.AddForce(new Vector2(dirX, 0) * this.moveForce);
            //this.rBody2D.AddForce(this.transform.right * dirX * this.moveForce);
        }

        //방향의 따라서 반전
        if(dirX != 0)
        {
            this.transform.localScale = new Vector3(dirX, 1, 1);
        }

        //플레이어의 속도에 따라서 애니메이션 속도를 변경
        this.anim.speed = speedX / 1.3f;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        Debug.LogFormat("OnTriggerEnter2D: {0}", collision.name);
        Debug.Log("Game Clear 씬으로 전환!");
        SceneManager.LoadScene("ClearScene");
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if(collision.gameObject.tag == "Cloud")
        {
            
            jumpCount = 1;
        }
    }
    private Vector3 ClampPosition(Vector3 position)
    {
        return new Vector3 (Mathf.Clamp(position.x,-3.0f,3.0f)
            ,this.transform.position.y,this.transform.position.z);
    }

    
}

ClearDirector : 다시 원래 게임의 씬으로 돌아오는 것을 담당하는 클래스

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class ClearDirector : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            //게임씬으로 전환
            SceneManager.LoadScene("GameScene");
        }
    }
}

CameraController: 카메라가 고양이를 따라다니게 하는 클래스

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour
{
    private GameObject catGo;
    // Start is called before the first frame update
    void Start()
    {
        this.catGo = GameObject.Find("cat");

    }

    // Update is called once per frame
    void Update()
    {
        this.transform.position = ClampPosition(this.catGo.transform.position);
    }

    private Vector3 ClampPosition(Vector3 position)
    {
        return new Vector3 (this.transform.position.x,
            Mathf.Clamp(position.y,0.0f,20.0f),this.transform.position.z);
    }
}

결과

게임 시범

 

'유니티 기초' 카테고리의 다른 글

유니티 애니메이션 & 직선 이동 및 대각선 이동  (0) 2023.08.04
유니티 밤송이 던지기  (0) 2023.08.04
고양이 화살 피하기 게임  (0) 2023.08.02
2023/08/01 복습  (0) 2023.08.01
Swipe car 음향 및 UI 추가  (0) 2023.08.01