유니티로 태양계 만들기

sanghoon·2022년 1월 13일
0
post-custom-banner

유니티로 간단한 태양계 만들어보기


서론

레퍼런스에 써져 있는 강의를 듣는 중, 강사님이 오프라인이었으면 과제를 낼 수 있어서 좋았었을 텐데 아쉽다는 소리를 하셔서 작성하는 글.

강의를 진행하면서

  • 태양과 지구 오브젝트에 material을 입히고
  • 지구의 자전과 공전 구현
  • 키보드와 마우스를 활용한 줌인/줌아웃 카메라 회전 및 이동

위 세 가지를 구현한 상태이다. 이 포스트에서는

  • 위에서 구현한 스크립트 코드에서 어떤 부분을 수정했는지
  • 각 행성들의 자전축 각도 및 자전과 공전 각속도를 어떻게 설정했는지
  • 시연 영상

위 세 가지를 차례대로 살펴보도록 하겠다.

코드 수정 부분

먼저 지구에 붙어있는 스크립트는 다음과 같다.

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

public class EarthOrbit : MonoBehaviour
{
    private float rotateAngle = 0f;
    private float selfRotateAngle = 0f;
    public static float selfRotateSpeed = 1000f; // 지구의 자전 각속도; 임의로 설정
    private float rotateSpeed = selfRotateSpeed / 365.26f; // 지구의 공전 각속도
    private float rotateRadius = 1.0f;

    void Start() {
        rotateRadius = transform.localPosition.x;
        Debug.Log(rotateRadius);
    }

    // Update is called once per frame
    void Update()
    {
        // get desired position
        float xPos = rotateRadius * Mathf.Cos(rotateAngle);
        float zPos = rotateRadius * Mathf.Sin(rotateAngle);

        transform.localPosition = new Vector3(xPos, 0f, zPos);

        rotateAngle += rotateSpeed * Time.deltaTime;

        selfRotateAngle = selfRotateSpeed * Time.deltaTime;
        //transform.Rotate(Vector3.up, selfRotateAngle)
        //이 메서드는 시계방향으로 회전시키므로 selfRotateAngle을 음수로 설정
        transform.Rotate(Vector3.up, -selfRotateAngle);
    }
}

강의에서는 지구만 구현하면 됐었으므로 공전각속도 공전반경 등등 모든 변수를 스크립트 내에서 초기화했었지만,
수정된 코드에서는 행성들이 실제 위치 순서에 따라 유니티에서 이미 정렬되어 있는 상태였기 때문에 Start()에서 rotateRadius를 초기화해주었다.

    void Start() {
        rotateRadius = transform.localPosition.x;
        Debug.Log(rotateRadius);
    }

모든 행성의 초기 위치는 y축 좌표와 z축 좌표가 0이었기 때문에 x축의 좌표가 회전반경이 된다.

카메라에 붙어있는 스크립트는 따로 건드리지 않았다. 강의에서 스크립트에 써있는 기능을 모두 사용할 수 있다.

자전축 및 각속도 설정

자전축은 유니티 내에서 rotation의 z좌표를 바꿔줌으로써 설정하였다.

또한 한국천문연구원에 지구의 자전 주기에 따른 각 행성의 자전 공전 주기 자료가 있었기에, 지구의 자전 각속도를 static으로 선언한 후 해당 값을 기준으로 각 행성의 자전 각속도와 공전 각속도를 설정하였다.

// in EarthOrbit class
    public static float selfRotateSpeed = 1000f; // 지구의 자전 각속도; 임의로 설정
    private float rotateSpeed = selfRotateSpeed / 365.26f; // 지구의 공전 각속도

// in UranusOrbit class
    void Start() {
        rotateRadius = transform.localPosition.x;
        selfRotateSpeed = EarthOrbit.selfRotateSpeed / 0.7f;
        rotateSpeed = EarthOrbit.selfRotateSpeed / 30707.49f;
    }

나머지 행성에 대해서도 비슷한 코드를 복붙해주면 된다.
Planet 추상클래스를 생성한 후 상속받는 코드를 구현했다면 더 객체지향적이지 않았을까 하는 생각이 들었다.

시연 영상


위 사진을 클릭하면 유튜브 링크로 연결됩니다.


reference

패스트캠퍼스 게임 개발자 취업의 모든 것 초격차 패키지 Online. 강의
material : Solar system textures
행성의 물리량 참고 자료 : 한국천문연구원, 위키피디아

post-custom-banner

0개의 댓글