본문 바로가기
Development/C#

멋쟁이사자처럼부트캠프 Unity 게임 개발 3기 27일차

by Mobics 2024. 12. 27.

 

목차


    앵그리버드 만들기

    24.12.27

    Bird 체력 구현 및 상태 업데이트

    >> Monster.cs

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using Unity.Mathematics;
    using Unity.VisualScripting;
    using UnityEngine;
    
    public class Monster : MonoBehaviour
    {
        public ParticleSystem destroyEffect;
        
        public int maxHp, hp = 3;
        
        public Sprite damagedSprite;
        public Sprite moreDamagedSprite;
    
        public Action State;
    
        private void Start()
        {
            State += ChangeState;
        }
    
        void ChangeState()
        {
            if (maxHp > hp && hp > 1)
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = damagedSprite;
            }
            else if (hp == 1)
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = moreDamagedSprite;
            }
            else if (hp <= 0)
            {
                Destroy(gameObject);
                State = null; // 몬스터가 삭제되고 나서 불러오면 에러가 발생하니 이를 미연에 방지
                var effectObject = Instantiate(destroyEffect, transform.position, quaternion.identity);
                effectObject.Play();
            }
        }
    }

    ※ Hp 설정 및 Sprite 바인딩

    └ 충돌 레이어 설정

    : 기본적으로 땅 <-> (몬스터, 구조물, 새) 는 충돌해야 맵에 서있을 수 있음

    배치하는 장애물들

    >> 발생하는 문제 및 해결법

    1. 땅 <-> 몬스터 --> 충돌마다 데미지를 받으면 배치하자마자 데미지를 받게 됨

    : 몬스터의 자식으로 Object(HitCollision)를 만들고 Circle Collider2D를 넣은 뒤, Exclude Layers에 Ground 추가

    --> 이후 Script를 추가하여 OnTriggerEnter2D 및 CompareTag로 처리

    Monster의 자식Object

     

    2. 몬스터 <-> 구조물 --> 구조물 위에 배치한 몬스터는 배치하자마자 데미지를 받게 됨

    : bool을 이용해서 처음 구조물이 trigger 됐을 때 true 시켜주면 그 뒤로는 데미지를 받음

     

    >> HitCollisionMonster.cs

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class HitCollisionMonster : MonoBehaviour
    {
        private bool firstStructureHit = false;
        
        private void OnTriggerEnter2D(Collider2D other)
        {
            if (!firstStructureHit)
            {
                if (other.gameObject.CompareTag("Structure"))
                {
                    firstStructureHit = true;
                    return; // 처음에는 firstStructureHit만 true로 바꾸고 멈춘다.
                }
            }
            
            if (other.gameObject.CompareTag("Player") || other.gameObject.CompareTag("Structure"))
            {
                GetComponentInParent<Monster>().hp--;
                if (gameObject != null)
                    GetComponentInParent<Monster>().State?.Invoke();
            }
        }
    }

     

    Monster Animation 넣기

    1. Animation 생성

     

    2. Animator에 배치 및 설정

    ※ Has Exit Time : 체크 해제하면 애니메이션 전환 딜레이가 사라짐

     

    3. Animation에서 Sprite를 활용하여 Animation 제작

     

    4. Animation 관련 코드 작성

    >> Monster.cs

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using Unity.Mathematics;
    using Unity.VisualScripting;
    using UnityEngine;
    
    public class Monster : MonoBehaviour
    {
        private static readonly int IsDamaged = Animator.StringToHash("IsDamaged"); // Parameters를 id화
        public ParticleSystem destroyEffect;
        
        public int maxHp, hp = 3;
    
        public Action State;
    
        private Animator animator;
    
        private void Start()
        {
            State += ChangeState;
            animator = GetComponent<Animator>();
        }
    
        void ChangeState()
        {
            if (maxHp > hp && hp > 1)
            {
                animator.SetInteger(IsDamaged, 1); // Animation Parameters 변경
            }
            else if (hp == 1)
            {
                animator.SetInteger(IsDamaged, 2); // Animation Parameters 변경
            }
            else if (hp <= 0)
            {
                Destroy(gameObject);
                State = null; // 몬스터가 삭제되고 나서 불러오면 에러가 발생하니 이를 미연에 방지
                var effectObject = Instantiate(destroyEffect, transform.position, quaternion.identity);
                effectObject.Play();
            }
        }
    }

    스페이스를 누를 때 버튼이 한번 더 눌리는 문제 해결

    : 현재 선택된 오브젝트의 포커스를 해제하는 코드

    EventSystem.current.SetSelectedGameObject(null);

    24.12.29

    추가 작업 (12/29)

    • 인트로 화면 추가
    • 인트로 및 게임 BGM 추가
    • 인트로 버튼 누를 때 Scene 전환 및 효과음 추가

    24.12.30

    추가 작업 (12/30)

    • 몬스터 죽을 때 소리 나오도록
    • 맵 디자인 배치