텍스트 파일에서 3차원 좌표값을 읽어와 Vector3 배열에 저장하기

하나둘셋·2024년 2월 27일

목표

저번 게시물에서 3차원의 좌표값을 텍스트 파일에 기록했다. 텍스트 파일을 열어서 이 값들을 가져와 배열에 저장하고, 이 배열은 3D 캐릭터의 움직임을 구현할 때 사용할 것이다.




어떤 방식으로 값을 읽어올 것인가?


구현 계획
: 한 프레임마다 13개의 관절 좌표값이 기록되었기 때문에 값을 읽을 때도 한 프레임에 13개의 좌표값을 한번에 가져와서 저장하자!





구현 코드

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO; //파일 입출력 위한 헤더 파일
using System;

public class MoveCharacter : MonoBehaviour
{
    private string fullpth = "Assets/Avatar/JointTextFile/jabCross.txt";
    
    
    StreamReader sr;          // 스트림 리더
    string[] textValue;       // 텍스트 파일 전체 행 저장 배열
    public int textCount = 0; // 행 개수
    string[] jointXYZ;        // 텍스트 파일에서 읽어온 x,y,z값을 잠깐 저장하는 문자열 배열
    Vector3[] realJoint;      // x,y,z 값을 저장하는 배열
    
     
     void Start()
    {

        FileInfo fileInfo = new FileInfo(fullpth);

        if (fileInfo.Exists)
        {
            Debug.Log("파일 존재");
            sr = new StreamReader(fullpth);
            textValue = File.ReadAllLines(fullpth); //텍스트 파일의 모든 행 읽어들이기
            textCount = textValue.Length;

        }
        else
        {
            Debug.Log("파일 경로에 파일이 없습니다. 경로가 잘못되었는지 확인하세요.");
        }
    }
    
    //Update is called once per frame
    void Update()
    {
       realJoint = new Vector3[13];
       string line = null;

        try{
            
            if (textCount > 0) //textCount가 0일때 line변수에 Null값이 들어가게 됨
            {
                for (int i = 0; i < 13; i++)
                {
                    line = sr.ReadLine(); //파일의 한줄씩 받아오기 \n까지
                    jointXYZ = line.Split(' '); //3개의 값을 ' ' 을 기준으로 나눠 배열에 저장

                    //string으로 저장되어 있는 값을 float형으로 변환 후 저장
                    realJoint[i].x = float.Parse(jointXYZ[0]);
                    realJoint[i].y = float.Parse(jointXYZ[1]);
                    realJoint[i].z = float.Parse(jointXYZ[2]);

                    textCount--;
                }
            }
            else
            {
                sr.Close(); // streamReader 닫음
                Debug.Log("스트림 리더 닫음");
                UnityEditor.EditorApplication.isPlaying = false;
            }
        }
        catch (NullReferenceException e) {
            print("오류 사항 : " + e);
            Debug.Log(line);
        }
}

코드 부연설명

  1. FileInfo 클래스 생성자에 정보를 확인하고자 하는 파일의 전체 경로를 인자로 넘기고 FileInfo 클래스의 Exists 메서드를 통해 파일이 존재하는지 알 수 있다.

  2. Start() 함수에서 파일이 존재한다면 스트림 리더를 열고 텍스트 파일의 모든 행을 읽어들인 후 testValue 배열에 저장한다. testValue 요소는 한 행의 문자열이다.
    읽어들인 행의 개수를 구해 textCount에 저장한다.

  3. Update() 함수에서 textCount가 0보다 큰지 확인하는 이유는 텍스트 파일의 마지막 행이 비어있기 때문에 마지막 행을 읽어 들이게 되면 null값이 line 변수에 저장된다. 따라서 오류가 발생하기 때문에 마지막 행은 읽어들이지 않도록 한다.




코드를 실행 했을때 텍스트를 한줄씩 읽어서 Vector3 배열에 값이 잘 들어가는 것을 확인했다.




텍스트 파일에서 캐릭터의 관절 값을 받아와 저장함으로서 이제 캐릭터 움직이는 것을 만들기 위한 준비가 되었다. 매번 소켓 통신으로 잘 정돈된 관절의 좌표값을 받아오기엔 어려움이 있기 때문에 텍스트 파일의 기록된 값으로 관절이 잘 움직이는지 손쉽게 테스트할 수 있다!

profile
하나씩 뚝딱뚝딱

0개의 댓글