[VR/Unity] 캐릭터를 래그돌 또는 잔해로 대체

cherry_·2023년 6월 1일

참고 : https://docs.unity.cn/kr/2021.3/Manual/InstantiatingPrefabs.html

진정한 개발자라면 문제가 생겼을 때 docs를 보는 것...... (아님) (개인 의견임)
그러나 나는 쩌리라 매일 티스토리와 스택오버플로우를 닥닥 긁어서 봤는데
이번에! docs 보고! 생각보다 너무 유용했음
..그냥 자랑질 해봤어요

내가 구현하려는 것

크리스탈을 총알로 맞추면 터지는 애니메이션을 재생해야한다.
근데 터지기 전 크리스탈(crystal origin)과 터진 후 애니메이션이 적용된 크리스탈(crystal blow) 이렇게 2개의 오브젝트가 주어졌다.

첫 번째로 생각한 방법

  • 크리스탈 오리진 -> 충돌 시 destory -> 크리스탈 blow Instantiate

내 머릿속 .oO(너무 비효율적인 게 아닌가.. 용량을 많이 잡아먹을 것 같은데)

온전한 게임 오브젝트를 삭제한 후 인스턴스화된 파괴된 프리팹으로 교체하는 것이 훨씬 더 효율적이고 효과적입니다.

교체하는 것이 훨씬 더 효율적이고 효과적입니다.

오늘도 뇌피셜 실패........~
그래도 알아서 다행이지...... 몰랐으면 디자이너님 괴롭히고 최적화도 실패했을 듯ㅎ;;; (백수 엔딩)

구현

  1. CrystalBlow.cs 생성
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CrystalBlow : MonoBehaviour
{
    [SerializeField] private GameObject blowVersion;

    public void onCollisionEnter()
    {
        Destroy(gameObject);		//맞은 물체 제거
        Instantiate(blowVersion, transform.position, transform.rotation);	//그 자리에 파괴된 프리팹 추가
    }
}
  1. 해당 스크립트를 맞출 물체에 넣기
    crystal origin에 넣는다.

  2. blow version 변수에 crystal blow 프리팹을 넣는다.
    파괴된 프리팹을 끌어다 넣어주면 되는데 중요한 건 프리팹임!

    폴더에 있는 걸 끌어넣어주셔야 함.
    씬에 있는 거 no~

  3. shooting.cs 에서 collision 발생 시(총알이 닿을 시) onCollisionEnter() 함수를 불러온다.

    public void TriggerShoot()
    {
        Ray ray = new Ray(firePos.transform.position, firePos.transform.forward);
        RaycastHit hitInfo;
        //크리스털에 총알이 맞았으면
        if(Physics.Raycast(ray, out hitInfo, 30))
        {
            //Debug.Log("hit!!!!!!!!!!!!!!:"+hitInfo.collider.gameObject.name);
            if (hitInfo.collider.gameObject.tag == "crystal")
            {
                BulletImpact(hitInfo);
                hitInfo.collider.gameObject.GetComponent<CrystalBlow>().onCollisionEnter(); //격추 시 크리스탈 효과
            }
        }

    }

네.. 그럼 끝입니다.

만약 안 된다면?

내가 맞출 물체에 다음 행동을 하지 않았는지 점검해보자.
1. collider 넣기
2. 적용한 collider 범위를 물체에 맞게 확장(수정)했는지
3. tag 가 shooting.cs에서 설정한 거랑 일치하는지
나는 ... cystal tag를 설정 안 해서 한 번 실패함

근데 바로 console 오류 보고 문제 해결해서 비교적 쉽게 구현이 끝났다!!

기타

파편이 터지는 애니메이션의 경우 playable director를 사용했는데...
사실 이건 잘 모르겠다.
alembic 패키지를 깔아서 썼는데 디자이너님이 다 해주신 거 받아오기 밖에 안했음
디자이너 님 사랑해요~

0개의 댓글