스파르타코딩클럽 게임개발

오늘은 스파르타 코딩 클럽 unity 게임 개발 과정 56일차(최종프로젝트 7일차 부숴진 오브젝트를 자연스럽게 구현하기)

코드천자문 2024. 1. 22. 06:04
반응형

전 포스팅은 보면 물체의 움직임이조금 부자연스럽다고 느낄수가 있다.

일단 물체가 부숴질떄 부자연스럽게 부숴지는 것이 느껴질것이다.

 

그래서 만든것이 Brack 스크립트다. 

 

ParentObject와 같이 부모오브젝트에 넣어줄 스크립트이며 파괴되거나 복구될때 바꿀 오브젝트를 프리펩으로 받는다. 

그리고 상호작용이 일어난 위치에서 파괴나 복구가 일어나며 그 모습이 자연스럽게 이어지게된다.

Brack 클래스

코드 전문

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

public class Brack : MonoBehaviour
{
    public GameObject Prefab;
    public float breakForce;
    GameObject frac;

    public void Destroing()
    {
        frac = Instantiate(Prefab, transform.GetChild(0).position, transform.GetChild(0).rotation, transform.parent);
        foreach (Rigidbody rb in frac.GetComponentsInChildren<Rigidbody>())
        {
            Vector3 force = (rb.transform.position - transform.position).normalized * breakForce;
            rb.AddForce(force);
        }
        Destroy(gameObject);
    }
    public void Restroring()
    {
        frac = Instantiate(Prefab, transform.position, transform.rotation, transform.parent);

        Destroy(gameObject);
    }
}

속성

  • public GameObject Prefab: 파괴될 때 생성될 프리팹을 참조
  • public float breakForce: 파괴 시 적용될 힘의 크기를 정의
  • GameObject frac: 파괴된 프리팹의 인스턴스를 저장할 변수

메소드

  1. public void Destroing()
    • 이 메소드는 오브젝트를 파괴할 때 호출
    • Instantiate 함수를 사용하여 Prefab의 복제본을 생성하고, 원본 오브젝트의 자식 위치와 회전으로 설정
    • foreach 루프를 사용하여 파괴된 프리팹의 모든 Rigidbody 컴포넌트에 힘을 적용합니다. 이 힘은 오브젝트의 중심에서 멀어지는 방향으로 적용됩
    • 원본 게임 오브젝트를 Destroy 함수를 통해 제거
  2. public void Restroring()
    • 이 메소드는 오브젝트를 복원할 때 사용
    • Instantiate 함수를 이용해 Prefab의 복제본을 생성 이때 위치와 회전은 원본 오브젝트의 위치와 회전을 사용
    • 원본 게임 오브젝트를 제거

사용 예

이 스크립트는 게임에서 오브젝트가 충돌이나 다른 이벤트에 의해 파괴되는 상황에서 사용될 수 있다.

예를 들어, 플레이어가 오브젝트를 공격할 때 Destroing 메소드를 호출하여 오브젝트를 파괴하고 조각들로 분해할 수 있고 반대로, 특정 조건에서 오브젝트를 다시 복원하고 싶을 때 Restroring 메소드를 사용할 수 있다.

이 스크립트는 특히 파괴 가능한 환경 요소를 구현할 때 유용하며, 시각적으로 매력적인 효과를 게임에 추가할 수 있습니다.

 

저번에 만든 DestroyedObject에서 Start 부분에 삽입하여 사용한다.

 brack = transform.parent.gameObject.GetComponent<Brack>();

 

DestroyedObject에 메서드를 구현해놓는다.

 public void Destroing()
    {
        brack.Destroing();
    }
    public void Restroring()
    {
        brack.Restroring();
    }

물체를 부술것이라면 타입을 DESTROY 복구할려면 RESTRORE을지정하면서 사용한다.

 if (child.Type == ObjectPropertyType.DESTROY && doneCount == childStates.Count )
        {
            //StartCoroutine(DstroyCorutine());
            child.Destroing();
        }

        if (child.Type == ObjectPropertyType.RESTRORE && doneCount + 2 == childStates.Count)
        {
            //StartCoroutine(RestroreCorutine());
            child.Restroring();
        }

원래라면 코루틴을 사용해서 따로 교체하는 코드를 구현했지만 주석처리한뒤에 이렇게구현했다.

 

 

아주 자연스럽게상호작용이 일어나는 모습  

퍄 이건 좀 멋진데

반응형