목차
앵그리버드 만들기
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로 처리
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)
- 몬스터 죽을 때 소리 나오도록
- 맵 디자인 배치
'Development > C#' 카테고리의 다른 글
멋쟁이사자처럼부트캠프 Unity 게임 개발 3기 31일차 (1) | 2025.01.13 |
---|---|
멋쟁이사자처럼부트캠프 Unity 게임 개발 3기 30일차 (0) | 2025.01.11 |
멋쟁이사자처럼부트캠프 Unity 게임 개발 3기 26일차 (0) | 2024.12.26 |
[멋쟁이사자처럼 부트캠프 TIL 회고] Unity 게임 개발 3기 18일차 (0) | 2024.12.19 |
[멋쟁이사자처럼 부트캠프 TIL 회고] Unity 게임 개발 3기 17일차 (1) | 2024.12.13 |