Unity에서 텍스트 데이터를 기반으로 게임 무대 만들기

11281 단어 Unity
저번의 계속.
지금까지 Unity의 UI에서 스테이지를 구성했지만 스크립트를 사용하여 텍스트 데이터를 스테이지로 만듭니다.
이렇게 하면 간단하게 무대를 늘릴 수 있다.

필요한 물품을 Prefab화하다


우선 지금까지 제작된 게임오브젝트 프리미엄을 녹인다.
미리 Prefab화하면 다른 Scene도 쉽게 사용할 수 있습니다.
Bar, Ladder, Block은 이미 Plefab화되었기 때문에 아래의 것들을 Prefab화하는 것을 잊지 마세요.
  • DirectionLight
  • Main Camera
  • unityChan
  • Hierrarchy에서 Project→Asseets→Prefab로 드래그합니다.
    이름은 ○○ Prefab 같은 것을 쓴다.

    새 Scene 만들기


    지금까지의 Scene은 일시적으로 개발에 사용됐기 때문에 기존에 사용했던 샘플용 Scene과 달리 새로운 Scene을 제작한다.
    Unity에서 Scene은 큰 단락으로 모든 GameObject가 리셋됩니다. (그렇지 않을 수도 있을 것 같습니다.)

    Scene 만들기


    메뉴에서 [File]->[New Scene]을 선택합니다.이름은 Stage로 지정됩니다.
    Prefab에서 Directional Light를 설정합니다.이것도 발로 원래 설치할 수 있는데 어차피 고정된 거니까 제일 먼저 설치해요.

    Stage 제작용 Script 작성


    빈 게임 Object 만들기, Script 로그인


    CommeObject->EmptyObject에서 아무 것도 표시하지 않는 Game Object를 만듭니다.
    Script를 Component로 등록합니다.
    GameObjectAdd Component에서 Stage Controller를 위해 Script를 선택합니다.cs를 만들고 등록합니다.

    StageController.cs


    주문은 아래와 같습니까?

    Prefab의 Instance


    Script를 사용하여 Prefab에서 GameObjectInstantiate를 만듭니다.
    단계 데이터의 기호에 따라 해당 Prefab을 해당 좌표에 설정하면 OK.
    var instance = (GameObject)Instantiate(obj, new Vector3(x, y, 0), Quaternion.identity);
    
    실제 Prefab은 GUI로 설정된 공공 필드입니다.
    이 부근은 편리할 뿐만 아니라 좋다.

    Camera Object의 Target 설정


    Main Camera object는 Target를 따라다니기 때문에 Target를 지정해야 합니다.
    UnityChan의 좌표를 지정하려면 화면 생성 시 UnityChan의 Objet을 유지합니다.
    그런 다음 Main Camera의 target field로 설정합니다.우선 좀 움직여라, 이렇게 하면 된다.
    Script는 다음과 같습니다.
    StageController.cs
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    
    public class StageController : MonoBehaviour {
        public GameObject blockPrefab;
        public GameObject ladderPrefab;
        public GameObject barPrefab;
        public GameObject playerPrefab;
        public GameObject cameraPrefab;
    
        const char BLOCK = '#';
        const char LADDER = 'H';
        const char BAR = '-';
        const char PLAYER = 'P';
    
        private GameObject playerObject;
    
        private Dictionary<char, GameObject> prefabMap;
    
        // Use this for initialization
        void Start () {
            prefabMap = new Dictionary<char, GameObject> {
                {BLOCK, blockPrefab},
                {LADDER, ladderPrefab},
                {BAR, barPrefab},
                {PLAYER, playerPrefab},
            };
    
            BuildStage(STAGE_DATA);
            if (playerObject) {
                var camera = (GameObject)Instantiate(cameraPrefab);
                var cameraScript = camera.GetComponent<Camera>();
                cameraScript.target = playerObject.transform;
            }
    
        }
    
        void BuildStage(string stageData) {
            // Left Botton's position is (0,0)
            var lines = stageData.Split('\n');
            int y = lines.Count();
            foreach (var line in lines) {
                y--;
                int x = 0;
                foreach (var ch in line) {
                    GameObject obj;
                    prefabMap.TryGetValue(ch, out obj);
                    if (obj) {
                        var instance = (GameObject)Instantiate(obj, new Vector3(x, y, 0), Quaternion.identity);
                        if (ch == PLAYER) {
                            playerObject = instance;
                        }
                    }
                    x++;
                }
            }
        }
    
    
        const string STAGE_DATA = @"
    #         H    #
    # P       H    #
    #         H    #
    #  #HHHHHHH    #
    #         H    #
    #---------H    #
    #         H    #
    ####H###########
    #   H--------- #
    #   H          #
    #   H ####     #
    #   H----      #
    #   H    ##### #
    #   H          #
    #   H          #
    ################";
    }
    
    

    Stage Controller 스크립트에 Prefab 연결


    StageController.cs의 Prefab Field에 있는 목적의 Prefab를 끌어서 놓는 등의 방법으로 등록합니다.

    기타 미세 조정


    카메라가 너무 가까워 전체가 보이지 않자 메인 카메라의'Field of View'를 60→100으로 바꿨다.

    유니티 소스가 작아져서 외로운데 어쩔 수 없죠...

    끝말

  • WebPlayer Edition
  • https://dl.dropboxusercontent.com/u/21300511/UnityRoadRunner/demo1g/demo1g.html
  • 소스 코드
  • https://github.com/mokemokechicken/UnityChanRoadRunner/tree/demo1g
  • 좋은 웹페이지 즐겨찾기