본문 바로가기
메타버스기반게임콘텐츠기획/그날의 강의

(9-2) 유니티unity 코딩: 매개변수, $, Beginner Code-for문

by Queenut 2021. 12. 21.

 * 매개변수

한 클래스에 같은 이름의 변수가 있으면 안 된다(name을 예시로).

근데 매개변수로 같은 이름을 써도 괜찮다. 왜냐하면 매개변수는 이 메서드 안에서만 사용되고, 메서드를 벗어나면 없는 것으로 치기 때문에.

numA, numB가 여러번 쓰였지만 문제가 검색되지 않는다.

만약 같은 이름의 변수(numA, numB)를 만든다면?

 

그래도 컴퓨터는 구분해준다.

어떻게? 변수numA, numB는 상위 블록, 메서드 안의 매개변수numA, numB는 하위 블록으로 구분되기에.

 

- 지역변수: 특정한 메소드 안에서만 이용되는 변수. (=매개변수.)

메서드 안에서 선언하는 변수는 전부 지역변수.

 

- 전역변수: 클래스 안에 선언된, 클래스 안에서 모두 사용되는 변수.

(같은 클래스의)메서드 안에 호출하려면 'this.[변수이름]'.

 

결과

 

 

 

 * $

큰따옴표(문자열) 앞에 '$' 를 넣어주면 문자열 속 { }안의 변수의 값이 그대로 나타난다.

 

 

 

 

 * 액세스 수식자(≒접근 지정자)

변수, 메서드 등 앞에 아무것도 없으면 private.

public numB는 보이지만 private numA는 보이지 않음.

 

- 에디터상에서 볼 수 있다 = public으로 되어있다.

 

 

 

 

 ** Beginner Code 시작

무료 에셋 템플릿, Beginner Code 다운로드

https://assetstore.unity.com/packages/templates/tutorials/creator-kit-beginner-code-151986

 

Creator Kit: Beginner Code | 자습서 | Unity Asset Store

Use Creator Kit: Beginner Code from Unity Technologies to elevate your next project. Find this & more 자습서 and templates on the Unity Asset Store.

assetstore.unity.com

>>약간 내려보면 Overview에 튜토 있으니 추가 참고하려면 참고하라.

 

 

....

managers: 게임 UI, 음악 등등

leverdesign: 마을 전체의 정보들을 담고 있음. 건물, 

 

게임 만드는데 어려운 것은 코드보단 오브젝트가 굉장히 많아서 어려운 게 더 크다.

 = 만들어진 게 많다 → 파악하는데 시간이 걸린다.

 → 이름을 잘 지어야 한다. 그래야 조금이라도 파악이 더 쉽다.

 

 

스크립트 SpawnerSample 열기

using UnityEngine;
using CreatorKitCode;

public class SpawnerSample : MonoBehaviour
{
    public GameObject ObjectToSpawn;

    void Start()
    {
        int angle = 15;
        Vector3 spawnPosition = transform.position;

        Vector3 direction = Quaternion.Euler(0, angle, 0) * Vector3.right;
        spawnPosition = transform.position + direction * 2;
        Instantiate(ObjectToSpawn, spawnPosition, Quaternion.identity);

        angle = 55;
        direction = Quaternion.Euler(0, angle, 0) * Vector3.right;
        spawnPosition = transform.position + direction * 2;
        Instantiate(ObjectToSpawn, spawnPosition, Quaternion.identity);

        angle = 95;
        direction = Quaternion.Euler(0, angle, 0) * Vector3.right;
        spawnPosition = transform.position + direction * 2;
        Instantiate(ObjectToSpawn, spawnPosition, Quaternion.identity);
    }
}

GameObject : 유니티에서 제공하는 형. Hierarchy 상에 있는 게임 오브젝트를 담을 수 있다.

Vector3 : 유니티에서 제공하는 자료형/구조체. float 값을 3개 가지고 있는 자료형(=float x, y, z). 세 개를 동시에 처리하려고 사용함. 오브젝트 기본 생성할 때, 트랜스폼의 Position, scale 등의 3개 값이 vector3이다.

transform.position : 속성Inspector의 position 3개 값을 말함. MonoBehaviour안에 기본으로 존재함.

Quaternion.Euler 

 

 

 

 * radius라는 새 변수를 만들고 스폰되는 거리를 늘려보아라.

본래 포션이 스폰되는 위치(spawnPosition = transform.position + direction * 2;).

 

 

첫 번째 방법,

여기에 radius 라는 변수를 선언해 5로 초기화하고, 숫자 2를 대체한다.

 

 

포션 스폰되는 위치가 +3 더 멀어졌다.

첫 번째 방법의 결과

 

 

두 번째 방법.

아예 메서드 밖으로 빼서 에디터에 radius 값을 조정할 수 있게 만든다.

일단 2로 지정하기.
에디터에 radius 가 생겼다.

이 수치를 5로 늘려도 같은 결과가 발생한다.

두 번째 방법의 결과

 

 

 

 * 함수의 양을 줄여보자.

어차피 똑같은 함수에 수치만 다른 값, 함수를 줄여서 표현해보자.

(포션을 늘린 것은 겸사겸사)

spawnPosition과 함수 하나를 이어붙여 메소드를 만든다.

 

그렇게 나온 결과.

int angle의 수치만 달리 넣어주면 스폰 완성.

 

게임 플레이 시 이렇게 나온다.

7개의 포션이 다른 angle로 나타났다.

 

 

 

 * for문을 이용해서 함수 줄이기

for([반복할 때 사용할 인덱스 변수]; [반복할 조건]; [한 번 반복했을 때 수행할 내용]) { ~내용~ }

 

for 시작하기에 앞서, Array를 알아야 한다.

어레이Array: 동일한 자료형의 변수 묶음. 여러 개의 변숫값을 하나의 묶음으로 해주고 싶을 때.

int[] angles; : angle들의 값을 가진 int 어레이 생성.

 

컴퓨터의 숫자는 0부터 센다.
Debug.Log 출력 결과.

 

 

만든 Array를 바탕으로 for문을 작성한다.

i는 0부터 시작하고, i가 angles의 길이보다 작을 때, i에 1씩 추가한다. 이러한 조건으로 { } 에 적힌걸 반복한다.
출력결과

 

Q. for 문의 반복 조건이 'i는 angles의 길이보다 작을 때'인데 이렇게 하면 맨 마지막 꺼 i와 숫자가 같아지니까 스폰이 안돼야 하는 것 아닌가요??

A. Length는 길이니까 1부터 시작! 그럼까지인 Array의 숫자보다 반드시 한 개 크므로 '<' 이 맞다.