잔잔이네
article thumbnail

일반적인 복사로 복제하는게 아닌 프로젝트뷰로 복제하여 복제와 재사용을 할 수있는데 하이러키 뷰의 게임 오브젝트를 프로젝트 뷰로 드래그하면 Prefab이 생성될 것이다.

 

Prefab

하이러키뷰는 객체

프로젝트뷰에 생성된 프리팹은 클래스와 비슷하다고 생각하면 좋다

 

 


Prefabs

하이러키 뷰의 게임 오브젝트를 프로젝트 뷰로 드래그하면 Prefab이 생성된다.

그리고 프로젝트 뷰에서 생성된 Prefab을 하이러키 뷰로 드래그하면 복제가 될 것이다.

 


Instantiate [게임 오브젝트 인스턴스화]

 

화면을 클릭했을 때 게임 오브젝트를 생성하는 스크립트를 만들어보자.

먼저 생성될 위치에 FirePos라는 빈 오브젝트를 만들어 준다.

그리고 이 위치가 우리 눈에만 보이기 위해 파란 구모양의 기즈모를 생성했다.

 

기즈모 생성 스크립트 (GizmoView)

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

public class GizmoView : MonoBehaviour
{
    public Color color = Color.blue;
    public float radius = 0.5f;

    private void OnDrawGizmos()
    {
        Gizmos.color = color;
        Gizmos.DrawSphere(transform.position, radius);
    }
}

 

다음으로 게임 오브젝트를 생성 위치와 생성 스크립트를 넣을 CreateManger라는 빈 오브젝트를 만들고

여기에 클릭했을 때 게임 오브젝트를 복제하여 생성하는 스크립트를 만들었다.

 

CreateObject 스크립트

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

public class CreateBall : MonoBehaviour
{
    public Transform firePos;
    public Object ball;
    public float minScale = 0.3f;
    public float maxScale = 1.5f;

    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            float y = Random.Range(-20f, 20f); // y축
            float x = Random.Range(-10f, 10f); // x축 
            Quaternion fireRot = firePos.rotation;
            Quaternion rot = 
                Quaternion.Euler(fireRot.x+x, fireRot.y+y, fireRot.z);
            GameObject ballObj =
                //(GameObject)Instantiate(ball, firePos.position, firePos.rotation);
                (GameObject)Instantiate(ball, firePos.position, rot);

            // 생성한 오브젝트의 크기를 조정
            float xscale = ballObj.transform.localScale.x;
            float yscale = ballObj.transform.localScale.y;
            float zscale = ballObj.transform.localScale.z;
            float _xscale = Random.Range(xscale * 0.3f, xscale * 1.5f);
            float _yscale = Random.Range(yscale * 0.3f, yscale * 1.5f);
            float _zscale = Random.Range(zscale * 0.3f, zscale * 1.5f);
            ballObj.transform.localScale = new Vector3(_xscale, _yscale, _zscale);
        }
    }

랜덤 함수로 x축, y축에 랜덤한 범위로 생성할 것인데 Instantiate로 인스턴스화하여 생성한다.

 

그리고 크기도 랜덤하게 scale을 조절하여 생성해볼 수도 있다.

이것은 생성만 하는 스크립트이기때문에 복제되어 생성된 오브젝트를 움직이는 스크립트는 따로 만들어야한다.

 

 

AddRelativeForce - Shot 스크립트

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

public class ShotBall : MonoBehaviour
{
    Transform tr;
    Rigidbody rb;

    public float power = 900f;
    Vector3 velocity;
    void Start()
    {
        tr = this.GetComponent<Transform>(); 
        rb = this.GetComponent<Rigidbody>();
        velocity = tr.forward;
        rb.AddRelativeForce(velocity * power);
    }
    
    void Update()
    {
        // Ball의 높이가 바닥아래로 -10이하면
        // Ball 게임오브젝트를 삭제한다
        if(tr.position.y < -10f)
        {
            Destroy(this.gameObject);
        }
    }
}

생성된 오브젝트가 Transform과 Rigidbody의 정보를 받아오고 방향을 velocity 벡터에 담아 저장한다.

그리고 AddRelativeForce로 velocity 벡터 * power로 힘을 주어 발사되는 오브젝트를 볼 수 있다.

(AddRelativeForce로 힘을주어야 한다)

 

 

AddRelativeForce해줄 프리팹에 ShotBall스크립트를 넣어주고 CreateManger에 Firepos(생성 위치)와 해당 게임오브젝트를 드래그하여 넣어준다.

여기서 프로젝트 뷰에 생성된 Prefab을 드래그하여 넣어주어야하고, Prefab에 ShotBall스크립트를 넣어주자. 
만약 하이러키뷰의 오브젝트를 복제하려 하면 null 오류가 나올 수도 있다.

 

이제 실행하여 클릭해보면 복제되는 게임 오브젝트들을 볼 수 있는데, 하이러키 뷰에서 보면 게임 오브젝트이름(Clone)이라고 생성되면서 복제될 것이다.

 

 

profile

잔잔이네

@잔잔잔잔

🌈

검색 태그