공부/Unity

[Unity] 커비 3일차, Layer Collision Matrix 안될 때 해결, 싱글톤으로 HP 선언 후 슬라이더 연동

굴러다니다니 2023. 4. 13. 17:09
728x90

1. 커비가 능력을 가지고 있을 때 능력벗고 별이 통통 튀어다니게 + 별을 먹으면 그 능력으로 다시 변신

1-1. 능력 벗는 파티클 애니메이션 찍기

 

완료!

 

1-2 능력 벗을때 파티클 생성 코드 + 걷는 도중 / 나는 도중 / 가만히 있는 도중 벗었을때 애니메이션 연결

점점 복잡해진다,,, 완료!!

 

1-3 능력 벗으면 나오는 별 애니메이션으로 돌아가게!

빙글빙글 완료!

 

1-4 별이 통통튀게 (벽돌 깨기같이)

material 제작 후 rigidbody material에 넣어주기 완료!

+ 스크립트 작성 (오타난 bounceStar script)

public class bouncStar : MonoBehaviour
{
    [SerializeField] float speed = 90f;
    public Rigidbody2D rb;
    public Vector2 dir;
    private GameObject kirby;
    public int change = 0;
    private Vector3 destination;
    private PolygonCollider2D coll;
    public bool isInhaled = false;
    private void Start()
    {
        kirby = GameObject.Find("Kirby");
        change = kirby.GetComponent<KirbyControl>().change;
        kirby.GetComponent<KirbyControl>().change = 0;
        rb = GetComponent<Rigidbody2D>();
        TryGetComponent(out coll);
        if (kirby.GetComponent<KirbyControl>().spriteRenderer.flipX == true)
        {
            dir = new Vector2(1, 1).normalized;
        }
        else
        {
            dir = new Vector2(-1, 1).normalized;
        }
        coll.isTrigger = true;
        rb.AddForce(dir * speed * 10f);
        Invoke("remove", 5f);
    }

커비를 찾고, 커비의 change값을 저장해두고, 커비의 change값을 0으로 바꿔준다.

rigidbody 선언, collider 선언, 커비가 오른쪽으로 가던중이면 별의 궤도를 왼쪽으로, 반대도 마찬가지의 if else문이고, 발사될 때 혹시 isTrigger될까봐 다시 true로 켜두고, speed와 방향을 곱해 순간적인 힘을 준다.

생성된 후 5초가 지나면 별은 사라진다.

 

 private void Update()
    {
        if (isInhaled)
        {
            if (rb.velocity.x > 0 || rb.velocity.y > 0)
            {
                rb.velocity = new Vector3(0, 0, 0);
            }
            destination = kirby.transform.position; //목표 지점
            Vector3 inhaleSpeed = new Vector3(0, 0, 0);
            transform.position = Vector3.SmoothDamp(transform.position, destination, ref inhaleSpeed, 0.1f); //목표지점까지 이동
            coll.isTrigger = true;
            gameObject.layer = 10; //이동하는 동안 레이어 다른 곳으로 처리 -> 충돌 무시를 위해 
            if (gameObject.transform.position.x <= destination.x + 0.04f && gameObject.transform.position.x >= destination.x - 0.04f) //먹혔으면
            {
                gameObject.SetActive(false);
                kirby.GetComponent<KirbyControl>().anim.SetBool("isInhale", true);
            }
        }
        else
        {
            if (kirby.GetComponent<KirbyControl>().change != 0)
            {
                //변신 된 후라면
                Destroy(gameObject);
            }
            coll.isTrigger = false;
        }
    }
    private void remove() 
    {
        Destroy(gameObject);
    }
}

지금 별이 빨아들여지고 있는 중이라면 진행중인 속도를 0으로 초기화해주고, 목표를 커비로 지정한다. 

(enemy의 beingInhaled 식과 동일하게 작성)

다만 삼켜졌을 시, 커비의 스크립트에서 별의 change값을 받아 willChange 변수에 저장한다.

빨아들여지지 않은 상태였다가 커비가 다른 적을 삼켜 변신을 했다면 바로 별을 삭제한다.

끝!

 

1-5 벽, 레이아웃들과만 충돌해야하는 별

 

분명 커비가 뱉는 별과 커비는 부딪히면 안되기때문에

각각 레이어를 Star, Player로 넣어주고, Star는 경계랑만 부딪히게 했는데 계ㅔ에ㅔㅔ 속 커비랑도 다 부딪힌다..

왜 이럴까

한시간동안 찾아보다가 영어로 찾아보니 무언가가 나왔다

 

첫날에 커비가 벽의 collider에 붙는 현상이 나와서 이것을 해결하기 위해 Platform Effector 2D를 추가해서 

플레이어의 콜라이더에 used by Effector를 체크해준게 전부였다.

 

근데 Platform Effector 2D의 초기 설정이 Use Collider Mask가 체크가 되어있었다.

이것을 체크하면 buildsettings에서 설정한 collider mask를 무시하고 디폴트 값으로 적용된다.

이것,,, 체크 해제만 해주면 바로 성공된다 우하하!

 

부딪히지 않고 잘 별이 발사된다 ( 그림의 상태가? )

 

1-6 별에 change값 넣고 받아오기

별이 생성될 때 kirby의 script에서 change값을 빼돌렸는데, 반대도 가능해야한다

내 근처에 별이 있고, 입에 머금었다면, star의 change값을 받아 will change에 넣어주고, star는 먹히는 중이라는 bool값을 true로 바꿔준다. isStar는 내가 삼킨게 별인지 적인지 확인하기 위한 bool 변수

 

입에 무언가가 있는 상태로 삼키고, 입에 있는 능력 (willChange)가 무능력이 아니라면 변신한다.

변신 파티클 생성 + change값을 입안의 change값으로 바꾸고, animation integer의 값도 바꿔준뒤, 입 안의 값을 초기화해준다.

 

능력이 있는 상태에서 능력을 벗으면 벗는 애니메이션이 나오고, animation의 능력 값을 별의 change값으로 바꾼다.

 

 

2. HP 슬라이더와 체력 연결

맞아서 피가 감소했다.

- 씬에 하나만 존재하는 커비의 체력이라 싱글톤으로 관리하기 위해 GameManager를 선언했다.

하지만 거기에서 slider를 받으려니 이를 못 찾아주는 문제가 생겼고, 이는 gamemanager의 슬라이더를 연결해주는 것이 아니라, 다른 Kirby라는 오브젝트에서 가져오는 것이었기에 변수를 새로 하나 더 선언해 지정해 줌으로써 해결했다.

 

GameManager

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

public class GameManager : MonoBehaviour
{
    public static GameManager _instance = null;

    public int MaxHP = 10;
    public float currentHP = 10;
    public GameObject sl_ob;
    public Slider slHP;

    void Start()
    {
        slHP = sl_ob.GetComponent<Slider>();
    }

    private void Awake()
    {
        if (_instance == null)
        {
            _instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject); 
        }
    }

    public void Damaged()
    {
        currentHP -= 1;
    }

    void Update()
    {
        slHP.value = currentHP / MaxHP;
    }
}

GameObject sl_ob를 드래그로 직접 드랍해주는게 포인트!

 

3. 변신 직후는 무적상태로 반짝거린다

몬스터에게 맞을 시 무적시간이 적용되는 원리와 동일하다

 

4. 커터 커비 기본 이동 애니메이션 연결

시간이 남아서 커터 커비까지 완료! 눈누난나~

(공격 및 적 만들기는 내일!)

728x90