고정 포대 게임 오브젝트 만들기

images폴더의 cannon을 씬 뷰에 드래그 앤 드롭해 게임오브젝트를 만듭니다. Order in Layer를 2로 하고 Box Collider 2D를 추가합니다. 자식오브젝트로 Create Empty를 추가하고 이름을 gate로 합니다. 위치를 포대 왼쪽으로 설정합니다. Empty라 보이지 않으므로 컬러 아이콘을 추가합니다

 

고정 포대 스크립트 만들기

스크립트를 하나 만들고 이름을 CanonController라고 합니다. cannon에 어태치 합니다.

 

변수

public GameObject objPrefab;        // 발생시키는 Prefab 데이터 
public float delayTime = 3.0f;      // 지연시간
public float fireSpeedX = -4.0f;    // 발사 벡터  X
public float fireSpeedY = 0.0f;     // 발사 벡터 Y
public float length = 8.0f;

GameObject player;                  // 플레이어
GameObject gateObj;                 // 발사구
float passedTimes = 0;              // 경과 시간

Start()

cannon의 자식오브젝트 gate와 Player를 찾아 연결해 줍니다.

void Start()
{
    // 발사구 오브젝트 얻기
    Transform tr = transform.Find("gate");  //자식오브젝트 transform 찾기
    gateObj = tr.gameObject;  //자식오브젝트 가져오기
    // 플레이어
    player = GameObject.FindGameObjectWithTag("Player");
}

Update()

passedTimes를 갱신하면서 delayTime보다 크면 포탄을 발사해줍니다. 발사위치는 gate의 위치인 gateObj이 됩니다. Instatiate(objPrefab)으로 포탄을 만듭니다. 스크립트로 런타임으로 프리팹을 이용 게임오브젝트를 만들어 줍니다.  rigidbody.AddForce()를 이용해 포탄을 발사하게 만듭니다.

 void Update()
{
    // 발사 시간 판정
    passedTimes += Time.deltaTime;
    // 거리 확인
    if (CheckLength(player.transform.position))
    {
        if (passedTimes > delayTime)
        {
            // 발사!!
            passedTimes = 0;
            // 발사 위치
            Vector3 pos = new Vector3(gateObj.transform.position.x,
                                      gateObj.transform.position.y,
                                      transform.position.z);
            // Prefab 으로 GameObject 만들기
            GameObject obj = Instantiate(objPrefab, pos, Quaternion.identity);
            // 발사 방향
            Rigidbody2D rbody = obj.GetComponent<Rigidbody2D>();
            Vector2 v = new Vector2(fireSpeedX, fireSpeedY);
            rbody.AddForce(v, ForceMode2D.Impulse);
        }
    }
}

CheckLength()

자신과 targetPos를 측정해 length 보다 크면 true 작으면 false를 리턴하는 함수입니다.

bool CheckLength(Vector2 targetPos)
{
    bool ret = false;
    float d = Vector2.Distance(transform.position, targetPos);
    if (length >= d)
    {
        ret = true;
    }
    return ret;
}

포탄 만들기

Images폴더의 shell을 끌어다 씬뷰에 놓습니다. 

Tag는 Dead를 선택하고 Layer를 Shell을 새로 만들어 지정합니다.

Circle Collider 2D를 추가하고 IsTrigger를 체크합니다.

Rigidbody2D를 추가하고 Gravity Scale를 0로 설정합니다.

포탄의 스크립트 만들기

ShellController 라는 이름의 스크립트를 만든후  shell 게임오브젝트에 추가합니다.

포탄이 발사되면 일정시간(deleteTime=3)후 제거되며 무언가 접촉해도 제거됩니다.

 

변수

public float deleteTime = 3.0f; // 제거할 시간 지정

Start()

void Start()  {
    Destroy(gameObject, deleteTime); // 제거 설정
}

OnTriggerEnter2D()

void OnTriggerEnter2D(Collider2D collision) {
    Destroy(gameObject); // 무언가에 접촉하면 제거
}

레이어의 접촉 설정 수정하기

포탄은 무언가 접촉하면 사라지기 때문에 포탑과 접촉해도 사라집니다. Edit>ProjectSettings>Physics2D 에서 Ground-Shell간의 매트릭스를 꺼준다.

이제 씬뷰에서 shell을  프로젝트뷰로 끌어다 프리팹을 만들어주고 씬뷰의 shell을 지워준다

cannon오브젝트의 스크립트 컴포넌트에 shell을 끌어다 적용하고 cannon역시 프로젝트뷰로 끌어다 프리팹으로 만든다.

플레이어가 cannon에 접근하면 포탄이 발사 된다.

+ Recent posts