본문 바로가기

Unity

[복습] Unity #2. C# 프로그래밍과 게임 개발

728x90
반응형

[1] C# 스크립트 파일 설명 및 작성

▶ Project 창에서 Create > C# script 작성

▶ 스크립트 이름을 Test로 변경

[스크립트의 구성]

처음 스크립트를 생성하면 다음과 같다.

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

public class Test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {      
    }
    // Update is called once per frame
    void Update()
    {      
    }
}

 

using (코드의 상단)

using 키워드를 이용하여 라이브러리의 경로를 지정하면 해당 라이브러리의 코드를 가져온다. 즉 C언어의 Include와 기능이 유사하다!

추가적으로 using뒤의 경로를 네임스페이스라고 한다.

 

 Start() 메서드

Start 메서드는 코드 실행이 되는 시작점을 의마하며 게임이 시작될 때 자동으로 한 번 실행된다.

따라서 게임이 시작과 함께 실행될 코드를 해당 메서드 안에 작성한다.

[스크립트의 수정]

· 스크립트를 수정해서 게임을 실행하면 Hello World! 를 출력해 보자.

/*생략*/
Debug.Log("Hello World!");
/*생략*/

이때 주의할 점이 일반적으로 C# 스크립트를 생성한 후 코드를 작성하고 실행하면 아래와 같은 에러가 뜰 것이다.

error CS0104: 'Debug' is an ambiguous reference between 'UnityEngine.Debug' and 'System.Diagnostics.Debug'

하지만 걱정하지 말자 상단의 using System.Diagnostics; 를 삭제하면 된다!

 

지금까지 스크립트를 만들어보았다. 하지만 스크립트를 만들었다고 바로 코드가 게임 내에서 '동작'하지 않는다. 이를 해결하기 위해 우리는 작성한 코드를 게임 내의 오브젝트로서 설정해줘야 한다.

 

하이어라키 > Create > Create Empty (이름을 설정하지 않은 경우 default로 GameObject로 설정)

프로젝트 창의 작성한 스크립트를 하이어라키 창의 GameObject로 드래그&드롭

 

드래그 & 드롭하면 스크립트가 들어간 것을 볼 수 있다.

[두 점 사이의 거리를 구하는 스크립트 작성]

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

public class HelloCode : MonoBehaviour{
    // Start is called before the first frame update
    void Start()
    {
        float Distance  = GetDistance(2,2,5,6);
        // debug.Log("캐릭터 이름: "+characterName);
        Debug.Log("(2,2)에서 (5,6)까지의 거리: "+Distance);
    }
    float GetDistance(float x1,float y1, float x2,float y2){
        float col = x2 - x1;
        float row = y2 - y1;

        float distance  = Mathf.Sqrt((col*col)+(row*row));

        return distance;
    }
}

이때  GetDistanc메서드는 위의 코드에서 만든 메서드로 전역적인 함수가 아니다!

인자로 네 개의 값을 받으며 각각 가상의 A의 위치 A(a, b) 가상의 B의 위치 B(x, y)로 (a, b, x, y)로 입력받는다.

두 점사이의 거리는 (x축의 차이)의 제곱 (y축의 차이)의 제곱의 루트이다.

[2] 게임 오브젝트의 제어

[클래스와 오브젝트]

· 객체 지향:  사람이 현실 세상을 보는 방식으로 프로그램을 오브젝트의 집합으로 이해하는 방식

· 클래스: 묘사할 생성 대상과 관련된 코드를 묶는 툴

· 오브젝트:  게임 월드 속의 사물 (하나의 독립적인 사물)

 

하나의 원본 클래스에서 여러 개의 오브젝트를 생성할 수 있으면 생성한 각각의 오브젝트는 독립적이며 구별이 가능하다.

[Animal 클래스 생성하기]

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

public class Animal {
    
    public string name;
    public string sound;

    public void Playsound(){
        Debug.Log(name + ":" + sound);
    }

}

 

생성한 클래스는 이름과 울음소리 변수를 생성했지만 아직 오브젝트에 연결하지 않은 '틀'이므로 게임에서 작동하지 않는다.

다시 말해 연결하지 않은 클래스는 실체를 가진 오브젝트와는 다르다.

[Animal 클래스를 상속하는 오브젝트 생성하기]

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

public class Zoo : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Animal tom = new Animal();
        tom.name = "톰";
        tom.sound = "나옹";

        tom.Playsound();
    }

위의 코드를 생성했다고 게임에 바로 반영되지 않음에 주의하자! 모든 C# 코드는 코드가 실행된 오브젝트와 연결되어야 한다.

따라서 코드를 실행하기 위해 생성된 오브젝트에 드래그&드롭 후에 게임을 실행하면 소스가 실행되는 것을 확인할 수 있다.

[멤버와 접근 제한자]

· 클래스의 멤버: 어떤 클래스에 속하되, 해당 클래스의 데이터와 행위를 표현하는 요소.

· 클래스의 필드: 클래스의 멤버 중 변수

· 접근제한자: 선택적으로 멤버의 공개 여부를 결정할 수 있는 키워드

public 클래스 외부에서 멤버에 접근
private 클래스 내부에서만 멤버에 접근
protected 클래스 내부와 파생 클래스에서만 멤버에 접근

[참조 타입과 값 타입]

참조 타입이란 변수에 실체가 아닌 실체로 향하는 참조(메모리 주소)가 할당되고 변수에 접근하면 참조를 통해 실체에 접근하는 변수이다.

이러한 참조 타입의 변수는 실체화된 변수가 아니며 new 선언자를 통해 새로운 오브젝트로서 동작해야 한다. 참조 타입의 참조값 변경에 따른 생각하지 못한 오류가 나타나기도 하는데 이는 아래 링크를 참조한다.

 

 

[Unity Composition]#4. 참조 타입

참조 타입 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Zoo : MonoBehaviour { // Start is called before the first frame update void Start() { Animal tom = new Animal(); tom.name = "톰"; tom.sound = "냐옹

udangtangtang-cording-oldcast1e.tistory.com

참조값은 실제 오브젝트의 메모리 주소에 대응되는 값으로 = 기호를 통한 참조값 변화는 메모리 주소의 '이전'을 의미한다.

참조 타입은 생성된 컴포넌트의 참조를 변수로 가져와 사용을 가능하게 하기 때문에 중요하다!

 

값 타입이란 해당 변수 공간에 값 자체를 저장하는 내장 변수의 타입을 말한다.

값 타입은 여러 변수가 하나의 실체를 공유하는 상황이 생기지 않는다.

[3] 변수로 컴포넌트 사용하기

[물리 큐브 생성]

1) 큐브 오브젝트 생성

2) 인스펙터 창에서 Add Component > Physics > Rigidbody

[Jumper script 생성]

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

public class Jump : MonoBehaviour
{
    public Rigidbody myRigidbody;
    void Start()
    {
        myRigidbody.AddForce(0,500,0);
    } 
}

 

 Rigidbody

리지드 바디 컴포넌트는 물리 기능을 제공하며, 힘을 주는 기능인 AddForce을 가지고 있으며 (x, y, z) 방향으로 입력한 값만큼 힘을 준다.

여기서는 y 뱡향으로 500만큼의 힘을 가한 것을 확인할 수 있다.

 

리지드바디 컴포넌트를 선언하였다고 해도 게임에서 리지드 바디를 구현하기 위해서는 아래와 같은 작업이 필요하다.

1. 실체 게임 컴포넌트에 해당 소스를 연결

2. 리지드 바디의 대상 오브젝트를 선언

 

728x90
반응형
댓글