본문 바로가기

유니티/뱀서라이크

뱀서라이크 따라하기 - 4강 재배치 스크립트 준비하기

이번에는 저번 글에서 재배치 준비를 한 것에 이어서, 재배치 스크립트를 만들어 보도록 하겠습니다.

먼저 c# 스크립트를 스크립트 폴더에 만들어 주고, 이름은 reposition이라고 지었습니다.

한번 더 c# 스크립트를 만들고, 이름은 game manager라고 지었습니다.

GameManager라고 파일 이름을 지어줄 경우, 유니티에서 이런식으로 자동으로 아이콘을 바꿔주게 됩니다.

추가적인 기능은 없고, 아이콘만 바뀝니다.

계층창에 빈 object를 만들어 이름을 GameManager라고 짓고, 스크립트에서 GameManager를 드래그 하여 컴포넌트로 추가해줍니다.

그런 뒤 GameManager에 들어가 아래처럼 코드를 짜줍니다

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

public class GameManager : MonoBehaviour
{
    public Player player;
   
}

이렇게 만든 뒤 저장하면, player변수는 public이므로 변수가 inspector창에서 확인하실 수 있을겁니다.

처음에는 none으로 아무것도 없을건데, 유니티에서 드래그하여 player오브젝트를 그 부분에 넣어주시면 됩니다.

저같은 경우는 player 오브젝트의 이름을 stand0으로 해놨었습니다. 

그 뒤 gamemanager 스크립트를 켜 다음과 같이 코드를 짜주었습니다.

public class GameManager : MonoBehaviour
{
    public static GameManager instance;
    public Player player;
   
    void Awake(){
        instance = this;
    }
}

instance의 경우에는 static을 이용하였는데, 이런식으로 코드를 짜 줄 경우 다른 파일에서도 바로 자동완성을 사용할 수 있습니다.

 

이제 RePosition 스크립트를 작업해보겠습니다.

void OnTriggerExit2D(Collider2D collision){
        if(!collision.CompareTag("Area"))
            return;

먼저 전에 설정해놓았던 Area 태그에 닿지 않았다면, return을 시켜 아래줄에 나오는 코드를 실행되지 않도록 만듭니다

        Vector3 playerPos = GameManager.instance.player.transform.position;
        Vector3 myPos = transform.position;
        float diffX =Mathf.Abs( playerPos.x - myPos.x);
        float diffy =Mathf.Abs( playerPos.y - myPos.y);

 

그 뒤, playerpos는 아까 만든 gamemanager의 instance에서 받아온 플레이어의 위치값으로 해주고, my pos는 현재 이 스크립트가 들어있는 오브젝트가 위치한 위치값으로 잡아줍니다

 

그 뒤, 그 둘의 거리값의 차이를 구하고 x좌표의 차이는 diffx , y 좌표의 차이는 diffy로 놓습니다.

 

        Vector3 playerDir = GameManager.instance.player.inputVec;
        float dirX = playerDir.x < 0 ? -1 : 1 ;
        float diry = playerDir.y < 0 ? -1 : 1 ;
    }

 

그 뒤 playerdir은 우리가 주는 방향키의 방향으로 하고, dirx는 0보다 playerdir.x의 값이 작다면 -1, 그렇지 않다면 1로 해줍니다.

diry의 경우도 마찬가지로 해주면 됩니다.

 

아직 만들어 지지는 않았지만, 그 뒤에 적이 나오기 위한 재배치 또한 구현해놓도록 하겠습니다.

        switch(transform.tag){
            case "Ground":
                if (diffX > diffy){
                    transform.Translate(Vector3.right*dirX*40);
                }
                else if (diffX < diffy){
                    transform.Translate(Vector3.up*dirY*40);
                }
                break;
             case "Enemy":
                break;
        }

 

switch문을 이용하여 구현하였습니다.

먼저 ground태그에 닿을 경우에, x값으로의 차이가 더 크면 오른쪽으로 1의 벡터값에 위에서 구한 방향값을 곱하고, 그 값에 다 20크기의 판 2개만큼 움직여 줘야 하기에 40을 곱해줬습니다.

 

반대의 경우에도 방향만 위쪽의 크기 1 벡터로 바꾸어 주었습니다.

아래쪽의 Enemy 케이스의 경우에는 추후 완성시킬 예정입니다.

 

다음 글에서는 재배치 하는 것을 마무리 해보도록 하겠습니다