cos, sin과 반지름값을 이용하여 간단하게 그릴수도 있는데 다른 방법을 이용해봤다.

Mid-Point circle drawing 알고리즘이랑 Bresenham’s circle drawing 알고리즘을 이용하여 원형을 그렸다.

public class CircleDraw : MonoBehaviour
{
    public float fScale = .5f;

    private Vector3 pivot;

    public List<Vector3> vertices;
    public float radius = 5.0f;
    // Start is called before the first frame update
    void Start()
    {
        vertices = new List<Vector3>();
        float heading;
        for (int a = 0; a < 360; a += 360 / 30)
        {
            heading = a * Mathf.Deg2Rad;
            vertices.Add(new Vector3(Mathf.Cos(heading) * radius, Mathf.Sin(heading) * this.radius, transform.position.z));

        }
        for (int i = 0; i < vertices.Count - 1; ++i)
        {
            Debug.DrawLine(vertices[i], vertices[i + 1]);
        }
    }

    // Update is called once per frame
    void Update()
    {
        for (int i = 0; i < vertices.Count - 1; ++i)
        {
            Debug.DrawLine(vertices[i], vertices[i + 1]);
        }
    }
}

 

 

 

'게임 개발 > 유니티' 카테고리의 다른 글

Unity 2D 길찾기 알고리즘 구현  (0) 2020.01.14
Unity로 Sphere 충돌 구현 실험  (0) 2020.01.13
Unity로 CubeCollider 만들기 -제작중-  (0) 2020.01.01
Unity로 Cube 만들기  (0) 2020.01.01
Unity로 Terrain 만들기  (0) 2019.12.30

Unity Cube를 만드는 방법.

 

큐브의 중심은 (0,0,0)의 좌표를 갖는다. 각 Vertice의 배열은 0에서 7까지이다. 1Unit의 큐브를 만들기 위하여

Vertices들에 인덱스 값이 아래와같은 순서로 들어간다.

Vertices 번호

일단 빈 게임오브젝트에 스크립트를 생성 한다.

각 vertice를 생성해준다. 

    private Vector3[] GenerateVertices()
    {

        // 8개의 vertice가 필요
        Vector3[] newVerts = new Vector3[]
        {
            new Vector3(-.5f,-.5f,-.5f), // 0
            new Vector3(-.5f, .5f,-.5f), // 1
            new Vector3( .5f, .5f,-.5f), // 2
            new Vector3( .5f,-.5f,-.5f), // 3
            new Vector3(-.5f,-.5f, .5f), // 4
            new Vector3(-.5f, .5f, .5f), // 5
            new Vector3( .5f, .5f, .5f), // 6
            new Vector3( .5f,-.5f, .5f), // 7
        };
        return newVerts;
    }

각 Vertices의 번호에 따라 Triangles을 만들어준다.

    private int[] GenerateTriangles()
    {
        int[] newTriangles = new int[3*12]
        {
            // left
            4,5,0,
            0,5,1,

            //right
            3,2,7,
            7,2,6,

            // bottom
            4,0,7,
            7,0,3,

            // top
            1,5,2,
            2,5,6,

            // front
            0,1,3,
            3,1,2,

            // back
            5,4,6,
            6,4,7,
        };
        return newTriangles;
    }

 

잘 생성이 되었다.

Wireframe view

 

 

-작성 중-

 

연구 1

Unity로 Terrain 만들기 

 

Mesh에 관한 공부를 하며 직접 터레인을 만들어보았다.

시작 시 터레인이 뜨게 만들었다. 

x축과 z축의 사이즈를 이용하여 원하는 만큼 터레인의 사이즈를 설정한다.

 

Unity는 시계방향(CW)으로 와인딩 순서를 사용한다. 블렌더는 시계 반대 방향으로 와인딩 한다.

따라서 Mesh의 Triangles 순은 0,1,2,  2,1,3으로 넣어줬다.

 

각 Vertice의 위치를 파악하기 위해 Vertices마다 Gizmos의 Sphere로 위치를 파악하게 하였다.

 

연구 2

Vertice의 위치 높낮이를 변경하기.

Material을 설정하고 랜덤 값을 줘서 높이를 변경해봤다.

연구 3

마우스를 클릭하면 클릭한 위치에서부터 지정된 범위까지 높이 변경이 가능하게 만들어보자.

1.  Terrain Collider를 구현한다. 충돌처리를 이용해봐야겠다.

2. 화면을 클릭하면 클릭한 스크린 위치에서부터 터레인까지 레이를 쏘는 부분을 직접 구현한다.

3. 

 

 

 

Script URL : 

 

NGUI 연습 겸 2주 안에 만들어볼 게임을 고르다가 조카의 두뇌에 도움이 될까 싶어 다운로드를 했었던 게임이 떠올랐다. 나름 재밌게 했었고 500만 이상 다운로드된 게임이므로 이 게임을 만들어보기로 했었다.

 

Fill One Line Puzzle게임을 한 사람들은 규칙을 알 것이다. 

각 타일마다 시작점이 있다. 시작점에서부터 상하좌우에 가까이 있는 타일을 터치하면 색이 변해야 한다.

이외의 타일을 터치하면 반응하지 말아야 하며 이전에 터치했던 타일을 터치하면 그 시점부터 다시 시작하게 해야 한다.

 

나는 어떻게 만들지 생각해보다가 생각보다 쉽게 이런 기능을 구현할 수 있는 방법을 찾아냈다.

하나의 Tile에 Box Collider를 아주 작게 만들어 상하좌우로 붙여놓았다. 

이렇게 하면 시작 시 각 타일마다  OnColliderEnter 함수에서 서로 충돌한 Tile들의 정보를 얻게 된다. 

코딩없이 주변에 있는 타일 정보를 가져올 수 있다.

타일을 터치하게 되면 타일이 터치되었다는 flag가 true로 바뀌게 된다. TileControl클래스에 Update() 함수에다가 로드된 스테이지의 모든 타일들을 검사하는 방식으로 확인을 하여 스택에 푸시하는 방법으로 했다.

TileControl class다. Update() 안에 구현 하였다.

지금 보니까 꽤나 무식한 방법으로 한 것 같은데 이 방법 말고 각 Tile이 눌려졌을 때 해당 타일이 눌러졌다는 이벤트를 보내는 방식으로 만드는 게 좋다. (내가 만든 코드를 보니... 리팩토링 각이다.) 눌러야 반응하는 부류의 게임은 웬만하면 Update()에 쓰지 말고 이벤트 처리 방식으로 만들자. 

 

----------

스테이지 추가

 

각 타일들의 정보가 저장되어있는 바이너리 파일이나 텍스트 파일에서 불러오거나 scriptableObject 같은 걸로 타일들을 초기화할 수도 있었지만 색다른 방법으로 스테이지나 타일들 추가가 용이하게 만들어 보려고 했다.

 

LS1_3 (왼쪽 숫자 1은 레벨이고 오른쪽 숫자 3은 스테이지)으로 이름을 바꾸고 타일들을 원하는 대로 배치한다. 

그 후에 처음 시작할 타일을 선택하여 isTouch만 체크해주면 스테이지 생성 완료.

가 아니라... 다 완성한 게 아니어서 완전 자동화로 만들지는 못했다. 때문에 한 가지 더 건드려줘야 할 게 있다. 레벨을 선택하면 스테이지를 선택할 수 있는 화면이 나오는데 스테이지를 복붙 하여 새롭게 만든 스테이지에 MyLevel과 MyStage에 새롭게 만든 스테이지 정보를 적어줘야 한다. 

나름 색다른 방법으로 간단하게 유니티 안에서 스테이지를 추가하는 방법을 적용해봤다.

 

 

프로젝트를 하면서 오브젝트 이름을 이용하여 레벨과 스테이지 저장할 수 있게 만들었다. (안 해도 되는데 문자열 연습 겸 해봤다) 이 정보를 이용하여 게임상에서 스테이지를 선택할 때 해당 스테이지의 정보를 찾아 SetActive(true)로 바꿔준다.

위와 같은 방법으로 레벨마다 스테이지의 개수를 원하는 만큼 추가를 할 수 있게 되었다.

 

-------------

보완해야 될 부분

 

게임 시작 시 각 타일마다 OnCollisionEnter로 주변 타일의 정보를 가져온 후 setActive(false)로 처리하는 방식으로 하였다.

이로 인해 레벨에 있는 모든 스테이지의 타일들의 OnCollisionEnter함수가 실행되어 프레임이 드랍되는 현상이 일어난다. 

메모리에 올라갈 스테이지들

컴퓨터보다 성능이 안 좋은 핸드폰에서 실행을 하게 되면 프레임이 드랍되는 시간이 늘어난다.

1초정도 프레임이 급격히 하락(컴퓨터)

 

또한 모든 스테이지를 메모리에 올리기 때문에 스테이지의 개수가 많아질수록 메모리 사용량도 늘어난다.

 

임시방편으로 Loading화면을 추가하고 코루틴에  WaitForSecondsReatime을 이용하여 모든 타일들의 CollisionEnter함수가 실행될 수 있도록 했다.

성능이 엄청 좋지 않으면 각 Tile들이  충돌된 Tile들의 정보를 Stack에 넣기도 전에 SetActive(false)가 되어 제대로 동작하지 않을 수도 있다. 

 

뗌빵용으로 이런 방법을 썼지만 제대로 된 해결방법은 스테이지들을 프리펩화하여 시작할 때 외부에서 Resources.Load를 이용하여 불러오면 된다.(나중에 리펙토링)

 

 

역시나 나의 기억력이 문제구먼.. 유니티를 사용하여 새로운 2D 게임을 만들어 볼까 끄적거려봤는데 거진 한 달 정도 안 하다가 해서 그런지 막히는감이 있다. 

 

뭔가 몬스터부분에서 잘못 건드림... 오류남. 고쳐야된다.

 

아래와 같이 맵을 구성한다. 3개의 맵을 만들었다.

시작 시 스테이지 선택 화면이 나온다. 스테이지를 선택하면 파일에서 불러와 맵을 세팅해준다.

 

숫자마다 의미함.

 

플레이어 위치로부터 렌더링 할 범위를 정해줘서 아래와 같이 나타나게 함.

V키를 누르면 맵을 한눈에 볼 수 있도록 함.

시작 지점과 목표지점이 있다. 

코인을 먹을 수 있다. 먹으면 스코어가 올라간다.

 

중력을 구현함. Space bar를 누르면 점프 한다.

블록 위로 점프하면 확률에 따라 아이템이 나온다.

왼쪽은 키커지는 아이템, 오른쪽은 총쏘는 아이템

아이템은 키커지는 아이템, 총쏘는 아이템이 있다.

키커지는 아이템을 먹을 경우

L 버튼을 누르면 총알이 발사된다. 일정거리 이상이 되면 총알을 할당 해제시켜서 사라지게 한다.

총쓰는 아이템을 먹을 경우

몬스터다. 닿으면 플레이어가 죽는다. 위 아래로 움직인다. 

닿으면 죽는다.

바닥으로 떨어져도 죽는다.

목적지에 도착하면 도착 메세지가 뜬 후 스테이지 선택 화면으로 돌아간다.

 

 

 

source : https://github.com/gkagm2/cpppractise/tree/master/cpptraining/ch1/Game/SuperMario

'게임 개발 > C++ console' 카테고리의 다른 글

2차원 좌표계에서 화살표를 그리기 위한 좌표 계산  (0) 2020.07.09
미디 키보드 건반 프로그램  (0) 2020.01.14
TextRPG  (0) 2019.11.12
미로찾기  (0) 2019.11.07
빙고 게임 (Player vs AI)  (0) 2019.10.30

+ Recent posts