달력

92024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

유니티(unity) 에서 간단한 Json(제이슨) 사용법


먼저 아래 주소를 통해 파일을 다운로드 합니다.

https://sourceforge.net/projects/json-lib/


아님 아래 파일 다운 받으세요~!

LitJson.dll


다운 받은 폴더 -> bin -> LitJson.dll 파일을 찾아 아래 그림처럼 unity Assets에 추가합니다.


Assets 에서 Plugins 폴더 생성


그림과 같이 드래그 하여 파일을 복사 합니다.


테스트용 Create Empty 하나 생성 하신후 JsonTest 용 스크립트를 생성하여 생성한 오브젝트에 스크립트를 추가합니다.



간단한 Save스크립트

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using System.IO;

using LitJson;


public class PlayerInfo

{

    public int ID;

    public string Name;

    public double Gold;


    public PlayerInfo(int id, string name, double gold)

    {

        ID = id;

        Name = name;

        Gold = gold;

    }

}


public class JsonTest : MonoBehaviour {


    public List<PlayerInfo> playerInfoList = new List<PlayerInfo>();


// Use this for initialization

void Start () {

        SavePlayerInfo();


}


    public void SavePlayerInfo()

    {

        Debug.Log("SvePlayerInfo()");


        // >> :

        playerInfoList.Add(new PlayerInfo(1, "이름1", 1001));

        playerInfoList.Add(new PlayerInfo(2, "이름2", 2002));

        playerInfoList.Add(new PlayerInfo(3, "이름3", 3003));

        playerInfoList.Add(new PlayerInfo(4, "이름4", 4004));

        playerInfoList.Add(new PlayerInfo(5, "이름5", 5005));

        // << :


        JsonData infoJson = JsonMapper.ToJson(playerInfoList);


        File.WriteAllText(Application.dataPath + "/Resources/Data/PlayerInfoData.json", infoJson.ToString());

    }


    // Update is called once per frame

    void Update () {

}

}



이러면 본인이 지정된 폴더로 정보가 저장이 됩니다.



간단한 Load스크립트

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using System.IO;

using LitJson;


public class PlayerInfo

{

    public int ID;

    public string Name;

    public double Gold;


    public PlayerInfo(int id, string name, double gold)

    {

        ID = id;

        Name = name;

        Gold = gold;

    }

}


public class JsonTest : MonoBehaviour {


    public List<PlayerInfo> playerInfoList = new List<PlayerInfo>();


// Use this for initialization

void Start () {

        LoadPlayerInfo();


}


    public void LoadPlayerInfo()

    {

        Debug.Log("LoadPlayerInfo()");


        if(File.Exists(Application.dataPath+ "/Resources/Data/PlayerInfoData.json"))

        {

            string jsonStr = File.ReadAllText(Application.dataPath + "/Resources/Data/PlayerInfoData.json");


            Debug.Log(jsonStr);

            JsonData playerData = JsonMapper.ToObject(jsonStr);


            for (int i = 0; i < playerData.Count; i++)

            {

                Debug.Log(playerData[i]["ID"].ToString());

                Debug.Log(playerData[i]["Name"].ToString());

                Debug.Log(playerData[i]["Gold"].ToString());

            }

        }

        else

        {

            Debug.Log("파일이 존재하지 않습니다.");

        }


    }



    // Update is called once per frame

    void Update () {

}

}

 


Posted by JakeGD
|

Humanoid 타입 애니메이션 


준비물 : 휴머노이드 타입 모델 준비


준비가 안되셨다면! Asset Store 에서 unity-chan 을 검색하여 무료 모델을 다운 받을 수 있습니다.!

Asset Store는 유니티 메뉴 바에서 Window -> Asset Store 클릭 하시면 됩니다.



일단 처음 Create Empty 하나 만드신 후 Player로 이름을 변경 하세요.

그리고 스토어에서 받은 모델을 드래그하여 하위 오브젝트로 등록합니다.

굳이 하위 오브젝트로 등록 하지 않으셔도 됩니다.! ㅎㅎㅎ.. 그냥 저 구별 편할려구요..




모델에 기본적으로 Animator 컴포넌트가 존재하지만 저를 따라 Create Empty 생성하셨다면 Add Component 를 통해 Animator 컴포넌트를 추가해 주세요.

또한 캐릭터 컨트롤을 위한 Character Controller 컴포넌트도 추가해 주세요!


현재 저의 컴포넌트 설정 상태 입니다.



그다음 플레이어 컨트롤을 위한 스크립트 하나 추가해 줍니다. 이름은 Mecanim Control 이라고 하였습니다.

그리고 해당 스크립트는 Player 오브젝트에 추가해 줍니다.


그리고 애니메이션을 사용하기 위한 Animation Controller 를 만들어 줍니다.

오른쪽 클릭후 Create에서 하위 쪽에 Animation Controller 이 존재합니다. 

만든후 이름을 MecanimPlayer 로 네이밍 해 주신 후 더블 클릭하여 들어갑니다.


간혹 창이 작아 전부 안보이시는 분이 있으실 텐데 창을 드래그하여 빼내신 후 늘리 시면 보입니다.


들어가면 왼쪽 상단에 Parameters 가 있는데 클릭하여 들어가신 후 아래 그림같이 설정해 줍니다.


Speed -> Float

Slide   -> Trigger

IsRun  -> Bool

Jump  -> Trigger

  •  여기서 Trigger 의 경우 애니메이션을 한번 실행 후 다시 자동적으로 false 시켜주는 Bool 값이라고 생각하시면 될거 같습니다.

각각 맞는 형식 으로 생성





여기 까지 설정 해 주신 후 아까 만든 MecanimControl 스크립트 먼저 작성하도록 하겠습니다.


using System.Collections;

using System.Collections.Generic;

using UnityEngine;


public class MecanimControl : MonoBehaviour {

    

    public float runSpeed = 6.0f; // 뛰는 속도

    public float rotationSpeed = 360.0f; // 캐릭터 회전 속도


    bool IsRun = false;  // 뛰기와 걷기 구별하기 위한 불값


    CharacterController pcController;  //캐릭터 컨트롤러 컴포넌트를 사용하기 위한 변수 선언


    Vector3 direction; // 방향 값

    Animator animator; // 애니메이터 컴포넌트를 사용하기 위한 변수 선언


void Start () {

        pcController = GetComponent<CharacterController>(); // 캐릭터 컨트롤러 컴포넌트 가져오기


        //animator = GetComponentInChildren<Animator>(); // 하위 에니메이터 사용

        animator = GetComponent<Animator>(); // 애니메이터 컴포넌트 가져오기


    }



    void Update () {


        CharacterControl_Slerp(); // 움직임을 정리한 함수

        animator.SetFloat("Speed", pcController.velocity.magnitude);  //컨트롤러의 속도 값을 애니메이터의 Speed와 연결

        animator.SetBool("IsRun", IsRun); // 걷기, 뛰기 체크값을 애니메이터 IsRun과 연결


        if(Input.GetMouseButtonDown(0))

        {

            animator.SetTrigger("Slide"); // Slide 애니메이션을 애니메이터 Trigger와 연결

        }

        if(Input.GetKeyDown(KeyCode.Space))

        {

            animator.SetTrigger("Jump"); // 애니메이터 Jump 애니메이션 연결

        }


        if(Input.GetKey(KeyCode.LeftShift))

        {

            IsRun = true;

            runSpeed = 6.0f;

        }

        else

        {

            IsRun = false;

            runSpeed = 3.0f;

        }

        

    }


    private void CharacterControl_Slerp() // 캐릭터 움직임 메소드 정의

    {

        direction = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));


        if(direction.sqrMagnitude > 0.01f)

        {

            Vector3 forward = Vector3.Slerp(transform.forward, direction, rotationSpeed * Time.deltaTime / Vector3.Angle(transform.forward, direction));

            transform.LookAt(transform.position + forward);

        }

            pcController.Move(direction * runSpeed * Time.deltaTime);

    }

}




이제 다시 MecanimPlayer Animation 창으로 오신 후 아래 그림 같이 생성 하도록 하겠습니다.


네모난 창은 오른쪽 클릭 -> Create State -> Empty 클릭 하시면 만들 수 있습니다.

화살표는 사각형 클릭 -> Make Transition 클릭 하시면 화살 표가 마우스 따라 생성 되는데 해당 화살표를 연결하고 싶은 사각형에 클릭하면 연결이 됩니다.


그리고 사각형 이름에 맞는 모션을 설정 해야겠죠?

사각형 클릭하시면 Inspector 창에 Motion 항목이 있는데 거기서 맞는 애니메이션을 등록 하시면 됩니다.




각 모션 설정 후 이제 화살표를 클릭하세요  Idle -> Walk 화살표 입니다.

그럼 Inspector 창에 무언가 뜨는데 거기서 아래로 내리시면 Settings 의 Conditions 항목이 있습니다.

거기서 + 클릭 후 아래 그림과 같이 설정 해 주시면 됩니다.



아 그리고 Settings 위에 Has Exit Time 이라는 체크 항목이 있는데

이것은 체크가 되있는 상태이면 해당 애니메이션이 완전 끝난 후 다음 애니메이션으로 진입하게 하며

체크가 되어있지 않은 상태라면 애니메이션 진행중 중간에 진입할 수 있게 하는 항목 입니다.


Walk -> Idle 화살표 입니다.


잘 보시면 float 형 Speed 옆에 Greater 와 Less 를 설정해 주는 게 있는데 Greater 는 옆의 숫자 보다 이상일때의 조건이며 Less 는 옆의 숫자보다 이하 일때 의 조건을 말합니다. 


나머지도 연결 해주시고!


위 사진 같이 Animator 의 Controller에 MecanimPlayer 을 드래그하여 연결해 줍니다.


그리고 이제 실행을 시키시면 완전 잘 돌아 갑니다.!!!!


혹시 필력이 딸려 이해가 힘드시다면 댓글 부탁드립니다.

ㅜㅜ

Posted by JakeGD
|

간단한 text 글씨 띄우기 



글자를 띄우기 위해서는


void OnGUI()

{


}


메소드가 필요하며 이안에서 글자가 출력이 됩니다.


private void OnGUI()

    {

        GUILayout.Label("GUILayout.Label 을 이용한 출력");


        GUI.Box(new Rect(0, 20, 300, 300), "GUI.Box 를 이용한 백그라운드 텍스트 박스");


        GUI.TextArea(

            new Rect(10, 40, 200, 20),

            "GUI.TextArea을 이용한 출력");


        if (GUI.Button(new Rect(10, 70, 200, 20),

            "GUI.Button을 이용한 출력"))

        {

        }


        if (GUI.RepeatButton( // 누르고 있는 동안 true를 계속 반환하는 버튼

            new Rect(10, 100, 50, 20), "<<")) 

        {

            // : 좌 회전

        }


        // 화면 사이즈 크기를 받아 위치 설정하기

        // Screen 을 이용하여 지정 가능


        GUI.TextArea(new Rect(Screen.width*0.01f, Screen.height / 2, 200, 20), "Screen을 이용한 위치설정");


    } 



적용 화면)


Posted by JakeGD
|

B라는 클래스가 A라는 클래스에 있는 변수 값들은 받아 조건을 새워야 하는상황이 올때가 있다.


그럼 C/C++ 처럼 B에 A를 선언 하여 사용 할 수 없을까?


있다!


사용예시)

public class SwordControl : MonoBehaviour {

    

    PlayerControl player;


    void Start ()

        {

        player = FindObjectOfType<PlayerControl>();

}

}


코드를 보면 PlayerControl 클래스를 SwordControl 클래스에 선언하여 사용한 방식이다.


PlayerControl 의 변수를 선언하고 선언한 변수에 FindObjectOfType<연결할클래스이름>(); 을 해주면 끝이다.


이 후 사용법언


player. 변수명 뒤 (.)을 넣어 사용하면 되겠다!


물론 public 선언된 변수만 사용이 가능하겠다!

Posted by JakeGD
|

간단한 코루틴(Coroutine) 사용법



  •  IEnumerator
    • 코루틴을 메소드 생성시 사용되는 반환 형식이며 yield return 구문을 포함하고 있어야 합니다.
    • yiedl return 행은 실행을 끝내고 다음 프레임에서 실행을 다시 재개할 수 있는 시점입니다.
    • 코루틴을 사용하려면 사용하고자 하는 구문에 StartCoroutine 함수를 이용합니다.

  • StartCoroutine
    • IEnumerator 형식으로 만들어진 코루틴 메소드를 실행하는 함수로 사용의 예로 특정키 입력시 또는 특정 값 도달시 시작되도록 할 수 있습니다.


사용 예시)  특정 물체를 일정 시간 마다 나타내기

 

void Start () {
        StartCoroutine(spawnWaves()); // spawnWaves라는 코루틴 함수 시작

        startWait = 3.0f;
        EnemyCount = 10;
        spawnWait = 2.0f;
    }

    IEnumerator spawnWaves()
    {
        yield return new WaitForSeconds(startWait);
// yield return 구문을 이용한 시간대기 함수(WaitForSeconds)
// 이러면 3초후 시작 이라는 의미

        while (true)
        {
                enemememy = EnemyStartPoint[UnityEngine.Random.Range(0, EnemyStartPoint.Length)];
                Instantiate(Enemy, enemememy.transform.position, enemememy.transform.rotation);
            yield return new WaitForSeconds(spawnWait);
// 2초마다 프리팹으로 만들어진 적들 소환

        }
    }



StartCoroutine 구문에서 spawnWaves() 로 호출해도 되지만 스트링 형식으로 "spawnWaves" 로 호출이 가능 합니다.

그리고 종료를 하고 싶다면 StopCoroutine을 이용해 StartCoroutin처럼 입력을 하면 해당 코루틴 함수가 멈춤니다.

또한가지 종료 방식이 있는데 StopAllCoroutines 함수로 실행되고 있는 모든 코루틴 함수를 종료 합니다.



Posted by JakeGD
|

Invoke, InvokeRepeating 



지연 호출, 일정 간격 호출 기능을 가지고 있는 Invoke, InvokeRepeating에 대해 알아보도록 하겠습니다.




  • Invoke

Invoke (string methodName, float time


invoke의 인자 값으로 methodName과 time이 들어 갑니다.


말그대로 첫번째에는 실행할 메소드의 이름을 넣어주고 두번째에는 몇초 후 메소드를 실행시킬것인지 시간을 적어 주시면 됩니다.


아래의 그림으로 예로 들면 "SpawnObject메소드를 2초후에 실행 시켜라" 라는 의미가 됩니다.


사용 예)

public class InvokeScript : MonoBehaviour {
    public GameObject target;
    
    void Start() {
        Invoke ("SpawnObject", 2);
    }
    
    void SpawnObject() {
        Instantiate(target, new Vector3(0, 2, 0), Quaternion.identity);
    }
}




  • InvokeRepeating

InvokeRepeating (string methodName, float time, float repeatRate


invokeRepeating의 인자 값으로 methodName과 time이 들어가며 Invoke와 다르게 repeatRate라는 인자값이 하나더 추가 되었습니다.


time 까지는 Invoke와 동일하며 3번째 인자값은 몇초마다 한번씩 실행을 시킬 시간을 적어주시면 됩니다.


아래의 그림으로 예로 들면 "SpawnObject메소드를 2초후에 1초마다 실행 시켜라" 라는 의미가 됩니다.


사용 예)

public class InvokeRepeating : MonoBehaviour {
    public GameObject target;

    void Start() {
        InvokeRepeating("SpawnObject", 2, 1);
    }
    
    void SpawnObject() {
        float x = Random.Range(-2.0f, 2.0f);
        float z = Random.Range(-2.0f, 2.0f);
        Instantiate(target, new Vector3(x, 2, z), Quaternion.identity);
    }
}



해당 Invoke 함수의 타임 인자값을 랜덤으로 돌릴 수 없습니다.

랜덤 값을 돌리긴 위해서는 코루틴(Coroutine) 라는 것을 이용해야 합니다.


코루틴 사용법 ↓↓↓↓↓


http://iflife1124.tistory.com/18


Posted by JakeGD
|

prefab(프리팹) 만들기



  • prefab(프리팹)의 용도
    • 프리팹은 같은 몬스터개체를 여러개 만들어 둬어야 하는경우.
    • FPS의 경우는 총알 사용시 프리팹을 이용해 복제하여 생성할 경우
    • 폭탄 같은걸로 벽돌 파괴시 벽돌이 따로따로 흩날리는 효과를 주기위한 경우
    • 즉, 무수히 같은 물체,개체를 인스턴스화 시킬 수 있게 하는것이 prefab(프리팹) 입니다.



  • prefab(프리팹)의 만들기

sphere을 이용하여 만들어보겠습니다.

Hierarchy화면에서 마우스 오른쪽 클릭 -> 3D Object -> Sphere 클릭

Project화면에서 Prefabs 폴더를 하나 만들어 주고 해당 Sphere를 그대로 드래그해 폴더에 옮겨 줍니다.


그럼 Hierarchy 화면에 있던 Sphere이 파란색 글자로 변경이 되면서 등록이 됩니다.


이게 prefab(프리팹) 만들기의 끝입니다.!


만들었으니 이제 사용해



  • prefab(프리팹)의 초 간단한 사용법

사용하기 위한 스크립트 Instantiate Test 이름으로 하나 만들어 주세요(다른 이름도 괜찮습니다.)


using System.Collections;

using System.Collections.Generic;

using UnityEngine;


public class InstantiateTest : MonoBehaviour {



    public GameObject bulletObj = null; // 담겨질 오브젝트 생성


void Start () {

}


void Update () {


        if(Input.GetKeyDown(KeyCode.Space)) // 스페이스바 클릭 조건

        {

    Instantiate(bulletObj, transform.position, transform.rotation);

            // Instantiate 메소드를 통한 초간단 인스턴스 생성!

        }


    }

}



위와 같이 작성 후

생성 위치가 될  Create Empty 하나 생성하고 해당 오브젝트에다가 스크립트를 적용 합니다.
그리고 오브젝트를 클릭해 보면 아래의 그림과 같이 Bullet Obj 라는 공간이 있는데 해당공간에 만들어둔 prefab을 드래그 합니다.
그럼 아래 화면과 같이 됩니다.



그리고 유니티 실행 후 스페이스바를 열심히 누르시면 열심히 누르신 만큼 Sphere가 생성이 됩니다!!

적용화면





Posted by JakeGD
|

게임오브젝트(GameObject)와 컴포넌트(Component) 관계 및 사용법




  • 관계
    • GameObject는 컨테이너 이며 사람, 차량 또는 물건등을 구성하는 다양한 조각들을 저장할수 있는 빈 상자이며 객체를 구성하는 다양한 조각들은 Components(컴포넌트)라고 합니다.
    • 사용할 오브젝트 종류에 따라 다양한 조각을 조합한 컴포넌트를 GameObject에 추가합니다.
    • 즉 GameObject는 커다란 큰 냄비이며 Components(컴포넌트)는 요리법을 구성하는 각종 재료라고 생각하면 됩니다.


  • 게임오브젝트(GameObject)
    • 다양한 컴포넌트들이 모인 것을 GameObject라고 함
    • GameObject에는 기본적으로 Transform 컴포넌트가 존재하며 GameObject가 어느 위치에 존재하는지 얼만큼 회전을 하고 있는지, 크기의 사이즈는 얼만큼인지 결정이 됩니다.
    •  GameObject 생성방법 
메뉴 항목 -> GameObject->Create Empty

생성 화면
빈 게임 오브젝트에서도 트랜스폼 컴포넌트를 가지고 있습니다




  • 컴포넌트(Component)
    • 모든 GameObject란 집합체의 기능적인 조각들
    • 컴포넌트(Component) 추가 방법
컴포넌트는 Inspector 항목에서 Add Component를 클릭 원하는 컴포넌트 찾아 클릭하거나 검색 칸에서 검색하여 추가.

 컴포넌트 브라우저 


Posted by JakeGD
|

Awake() 정의와 DontDestroyOnLoad() 사용법


Awake() 정의

  • Awake는 게임이 시작되기 전에, 모든 변수와 게임의 상태를 초기화하기 위해서 호출되며 스크립트 인스턴스가 종료될 때까지 한번만 호출됩니다. 

  • Awake는 모든 오브젝트가 초기화되고 호출되기 때문에, GameObject.FindWithTag를 이용해서 해당 게임 오브젝트를 요청하거나, 다른 오브젝트와 안전하게 연동해서 사용할 수 있습니다.


DontDestroyOnLoad() 사용법

  • 새로운 Scene이 로드될때 자동으로 파괴되지 않는 target 오브젝트를 만듭니다.
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour { void Awake() { DontDestroyOnLoad(transform.gameObject); } }

이런식으로 지정된 이전 오브젝트가 그대로 살아서 다음 씬으로 넘어갑니다.

대신 지워지지않아 직접 지워줘야 합니다.


그런 경우 간단히 조건 제시후 Destroy 메소드를 이용해 삭제 합니다.


예) M키를 누를시 조건

 if (Input.GetKeyDown(KeyCode.M))

        {

            Destroy(gameObject);

        }



Posted by JakeGD
|

Time.time.ToString 소수점 설정하기


소수점 설정은 의외로 간단 합니다.


ToString 괄호 안에 "N2" 만 넣어주면 됩니다.


예시)

 GUI.TextArea(new Rect(100, 50, 100, 30), "타이머 : " + Time.time.ToString("N2"));


소수점 2자리까지 나옴.


N1 = 소수점 한자리

N2 = 소수점 두자리

N3 = 소수점 세자리




Posted by JakeGD
|