개발일지

240828(수) Unity 강의 [고양이 특성 주기]

게임 프로그래머 2024. 8. 28. 17:42

3-4 특정위치에서 밥 쏘기

밥(food)를 특정 위치(dog)에서 쏘고자 하면 아래와 같은 로직을 사용한다.

 

void MakeFood()
{
     float x = transform.position.x;
     float y = transform.position.y;
     Instantiate(Food, new Vector2(x, y), Quaternion.identity); // Quaternion.identity는 별도의 회전값을 주지 않는다는 뜻
}

 

3-4 마우스 위치를 월드상의 게임오브젝트로 변경

private void Update()
{
    Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); 

// 스크린상의 떠돌아 다니는 마우스 위치를 월드상의 게임오브젝트 위치로 변경
    
    float x = mousePos.x; // 마우스 포인트(고양이 위치)를 -8.5f ~ 8.5f범위까지만 이동가능
    if (x > 8.5f) // x가 8.5보다 크다면
    {
        x = 8.5f; // 8.5 고정
    }
    if (x < -8.5f) // x가 -8.5보다 작다면
    {
        x = -8.5f; // -8.5 고정
    }

    transform.position = new Vector2(x, transform.position.y); // x는 마우스 위치, y는 현재 위치(변경되면 안됨)
}

 

3-5 고양이 내려오게 하기

void Start()
{
    Application.targetFrameRate = 60;
    float x = Random.Range(-9.0f, 9.0f); // x좌표 -9.0 ~ 9.0 랜덤 생성
    float y = 30.0f; // y좌표 30 고정
    transform.position = new Vector2(x, y);
}

 

3-5 고양이와 밥 충돌

밥에 Food 태그 부여

충돌현상은 한쪽에 rigidbody + 양쪽에 collider 조합

 

재생하면 밥이 올라가지다가 떨어지는 현상이 발견되는데

이것은 rigidbody(중력)의 영향 때문이다.

 

이럴경우 rigidbody의 body type을 dynamic에서 kinematic(중력의 영향을 받지않음)으로 변경하고

 isTrigger에 체크하면 된다. (체크해야 충돌감지가 됨)

 

그리고 이럴경우 OnCollisionEnter2D 함수를 사용할 수 없다.

대신 OnTriggerEnter2D 함수를 사용 가능하다. (아래 자세히)

 

3-5 충돌시 에너지 채우기

 

OnTriggerEnter2D 함수를 사용하여 Cat과 Food 태그와 충돌시 에너지를 1씩 더해주고

에너지가 채워지며, 충돌한 Food는 파괴되는 로직이다.

 

public GameObject hungryCat;
public GameObject fullCat;
public RectTransform Front;

float energy = 0.0f;
float full = 5.0f;
float speed = 0.05f;



private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.gameObject.CompareTag("Food"))
    {
        if(energy < full)
        {
            energy += 1.0f; // 에너지는 1씩 더해준다.
            Front.localScale = new Vector3(energy / full, 1.0f, 1.0f); //  x값만 증가, 소수점으로 나누려면 energy / 전체값
            Destroy(collision.gameObject); //충돌한 밥은 파괴
            if(energy == 5.0f)
            {
                hungryCat.SetActive(false); // hungryCat은 꺼준다.
                fullCat.SetActive(true); // fullCat은 켜준다.
            }
        }        
    } 
}

 

3-5 에너지 채워지면 기준 위치에 따라 고양이 이동시키기

고양이가 기준점(x좌표 0)을 기준으로 0보다 크다면 우측으로, 0보다 작다면 좌측으로 이동하는 로직

float speed = 0.05f;

void Update()
{
    if(energy < full) // energy가 full보다 작다면
    {
        transform.position += Vector3.down * speed; // pos y의 위치에 0.05씩 곱한값을 더해줌
    }
    else // energy가 full보다 크다면
    {
        if(transform.position.x > 0) // pos x의 값이 0보다 크다면
        {
            transform.position += Vector3.right * speed; // 오른쪽으로 이동
        }
        else // pos x의 값이 0보다 작다면
        {
            transform.position += Vector3.left * speed; // 왼쪽으로 이동
        }
    }
}