Models/Barrel 폴더를 보면 Barrel이 2개 있다. 화살표가 달려있는 확장자 FBX인 원본 3D로 작업한다.

선택해보면 프로젝트뷰 아래 확장자가 표시된다.

Barrel을 하이라키로 끌어다 놓고 Transform을 Reset하면 캐릭터에 비해 큰 Barrel이 보인다. 캐럭터 크기에 맞게 스케일을 조정해보자

Scale Factor

외부에서 임포트한 3D모델은 반드시 Transform의 Scale속성을 수정하지 말고 FBX Import setting의 Scale Factor속성을 수정한다. 프로젝트 뷰의 Barrel 3D모델을 선택하면 인스펙터 뷰의 3D모델의 여러정보(FBX Import Settigns)가 표시된다. 첫번째(Model)맵을 선택하고 Scale Factor를 0.4로 설정하면 현재 Barrel모델의 크기를 40% 크기로 조정할 수 있다. 스케일을 변경하고 하단에 있는  [Apply] 버튼을 클릭해 저장한다. (나의 경우 화면에 Apply 팝업창이 떳다)

이제 캐릭터와 배럴의 크기가 비슷해졌고, 배럴의 하이라키속 transform.Scale의 속성은 (1,1,1) 그대로이다.

하이라키뷰의 Barrel에 충돌처리를 위해 Capsule Collider와 Rigidbody컴포넌트를 추가한다. 잘보면 영역을 나타내는 구역이 작다.

Capsule Collider의 속성은 다음과 같이 수정해서 맞춘다. 

Rigidbody 컴포넌트는 질량 mass는 20으로 하고 Constraints는 위치와 회전에 제한을 거는 속성으로 Freeze Rotation x와 z축을 체크한다. x축 z축으로 회전을 금지한다. 넘어지지 않게한다.

게임 Play 후 총알을 발사해 보면 배럴이 살짝 뒤로 움직인다.

이제 Barrel에 충돌한 총알을 제거하고 스파크 효과를 만든다. Wall에 추가한 RemoveBullet스크립트를 재활용한다. Barrel에 RemoveBullet 스크립트를 추가하고 SparksEffect를 연결한다.

이제 실행해보면 배럴에 스파크 효과가 발생하고 Bullet이 없어진다.

배럴에 총알이 3번 충돌하면 배럴이 폭발하게 해보겠다. BarrelCtrl이라는 스크립트를 생성하고 다음과 같이 작성하고 하이라키 뷰의 Barrel에 추가한다.

BarrelCtrl의 ExpEffect속성에 폭발 효과를 내는 파티클을 연결한다. 03. Prefabs/ EffectExamples/ FireExplosionEffects/ Prefabs 폴더에 있는 SmallExplosionEffect를 연결한다. .새로 연결하면 Bullet의 Tag가 변경되는 이상한 증상이 있어 다시 만들어주고 연결해줬다.  폴더내 없는 분들은 Unity Particle Pack에서

 

 import 한후 새로만들어진 폴더에서 기존의 Prefabs폴더로 옮긴다.

SmallExplosionEffect는 프리팹을 선택하고 차일드를 포함하여 모든 Looping 속성을 모두 언체크한다.

실행해보면 잘된다.

 

하이라키뷰의 간략화

Barrel을 03.Prefabs폴더로 이동시켜 프리팹으로 변환하다.

이 프리팹을 이용해 20개정도 배럴을 배치하려고 하는데 그러면 하이라키뷰가 지저분해진다.

따라서 _Stage라는 EmptyObject를 만드고 하위에 복제하면 간단히 정리된다.

하이라키뷰에 빈게임오브젝트를 하나 만들고 이름을  _STAGE로 저장한다. _를 붙이는 이유는 하이라키뷰의 맨위로 보내기 위해서다.

이제 Barrel 프리팹을 _STAGE로 옮긴후 Ctrl-D를 눌러 20개 복사하고 위치를 바궈도 되지만 스크립트를 이용해 자동으로 배치해 보겠다.

StageCtrl 스크립트를 하나 만들어 _Stage에 적용시킨다.

x,z좌표를 랜덤으로 발생해서 Barrel을 배치한면서 Parent를 _Stage 의 transform으로 한다.

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

public class StageCtrl : MonoBehaviour
{
    public GameObject barrel;
    void Start()
    {
        for(int i = 0; i < 20; i++) {
            float x = (float) Random.Range(-24f, 24f);
            float z = (float) Random.Range(-24f, 24f);
            Instantiate(barrel,new Vector3(x,5f,z), Quaternion.identity).transform.SetParent(transform);
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

왼쪽이 실행전 오른쪽이 실행후이다.동적으로 생성된다.

사실 배럴의 좌표는 Random이므로 겹칠수도 있다. 따라서 49x49개의 좌표를 리스트로 만들어 놓고 랜던으로 하나씩 뽑으면서 배치하고 배치한건 리스트에서 지우주면 겹치치않게 만들수 있다.

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

public class StageCtrl : MonoBehaviour
{
    public GameObject barrel;
    void Start()
    {
        List<Vector3> posList = new List<Vector3>();
        for (int ix= -24; ix < 24; ix++) {
            for (int iz = -24; iz < 24; iz++) {
                posList.Add(new Vector3(ix, 0f, iz));
            }
        }
        for(int i = 0; i < 20; i++) {
            int randomIndex = Random.Range(0,posList.Count-1);
            Instantiate(barrel, posList[randomIndex], Quaternion.identity).transform.SetParent(transform);
            posList.RemoveAt(randomIndex);
        }
    }
}

 

 

+ Recent posts