EasyCastleUNITY

드래곤 플라이트 모작 개발일지3 (총알과 드래곤 충돌처리 및 배경 스크롤링) 본문

2D 프로젝트 개발 일지(드래곤 플라이트 모작)

드래곤 플라이트 모작 개발일지3 (총알과 드래곤 충돌처리 및 배경 스크롤링)

EasyCastleT 2023. 9. 13. 18:04

총알과 드래곤 충돌처리

전에 개발일지2에서 총알을 오브젝트 풀링을 사용하여 총알을 발사하는 방법을 사용했었습니다.

이번 개발일지에서는 드래곤과 총알을 충돌처리하고, 충돌하면, 총알은 다시 풀로 돌아가는 것을 구현해보겠습니다.

 

인 게임 상에서, 드래곤은 총알을 맞으면 맞는 애니메이션을 하지만, 실제로 속력이 줄어들거나 하지는 않습니다. 

그래서 이번에도 충돌처리는 OnTriggerEnter2D를 사용하여 만들어 보겠습니다. 

충돌처리를 하려면, 충돌하는 물체 2개 중 하나에게는 리지드 바디가 부여되어 있어야 합니다. 

저는 드래곤의 리지드 바디를 부여하고 중력을 0으로 만드는 방식으로 충돌처리를 구현했습니다. 

 

미리 만들어둔 Dragon과 Bullet 스크립트를 수정해보겠습니다. 

Dragon 스크립트에 충돌처리 부분 추가
Bullet 스크립트에 충돌처리 부분 추가

그리고 드래곤과 총알의 콜라이더의 isTrigger 속성을 추가했습니다. 

총알과 드래곤 충돌처리

이렇게 총알과 드래곤의 충돌처리가 완료되었습니다. 

배경 스크롤링

제가 모작하는 드래곤 플라이트는 카메라가 고정이 되어 있어, 배경 그 자체를 이동시키는 방식으로 만들었습니다. 

배경을 두개를 만들고, 단축키 V를 이용하여, 배경 2개를 연결했습니다. 

그 다음 위의 영상의 드래곤처럼 특정 위치에 가면, y= -10인 곳으로 돌아가도록 했습니다.

 

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

public class BackGroundScrolling : MonoBehaviour
{
    [SerializeField] float scrollSpeed = 0.5f;
    [SerializeField] GameObject[] backgorunds;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        for(int i=0; i<backgorunds.Length; i++)
        {
            var bg = backgorunds[i];
            bg.transform.Translate(Vector2.down * this.scrollSpeed * Time.deltaTime);
            this.SelfComeback(bg);
        }
    }

    private void SelfComeback(GameObject bg)
    {
        if(bg.transform.position.y < -10f)
        {
            bg.transform.position = new Vector3(bg.transform.position.x,10f,bg.transform.position.z);
        }
    }
}

시행결과

하지만 위에 영상처럼 점점 배경사이의 거리가 생겨나 부자연스러운 결과가 생기게 되었습니다. 

그래서 다른 방법을 찾았고, 아래의 동영상을 참고하여, 다른 방법으로 구현해 보았습니다. 

https://www.youtube.com/watch?v=HPhJngP695Y 

제가 기존의 구현했던 방식은 배경 2개가 번갈아 가며 움직이는 방식이었습니다. 

기존의 움직이던 구조

하지만 위에 동영상을 참고하여 만든 배경 스크롤링은 다릅니다. 

같이 내려오는 것은 같지만, 내려오다가 배경1과 배경2는 같이 동시에 원래자리로 돌아가게 됩니다. 

따라서, 위의 결과 동영상처럼, 이미지 사이의 거리가 점점 벌어지는 일이 발생하지 않습니다. 

 

이전에는 각 배경 끼리, 각각의 오브젝트였지만, 오브젝트 배경을 단축키  V를 통해 연결한다음,

하나의 배경을 다른 배경의 차일드화 시킴으로써, 하나의 오브젝트로 만들고

처음의 시작좌표를 저장해놓고, posY로 지정된 좌표로 이동이되면, 처음의 시작좌표로 이동하도록 만들었습니다.

완성된 백그라운드 스크롤링

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

public class BackGroundScrolling : MonoBehaviour
{
    [SerializeField] private float scrollSpeed = 0.5f;
    [SerializeField] private float endPosY; //전환되는 좌표
    Vector3 startPos;
    // Start is called before the first frame update
    void Start()
    {
        this.startPos = this.transform.position;
    }

    // Update is called once per frame
    void Update()
    {
        this.transform.Translate(Vector2.down*Time.deltaTime*this.scrollSpeed);
        this.SelfComeback();
    }

    private void SelfComeback()
    {
        if(this.transform.position.y < endPosY)
        {
            this.transform.position = this.startPos;
        }
    }
}

구현완료된 배경 스크롤링

이렇게 배경 스크롤링도 성공적으로 구현을 끝냈습니다.