상세 컨텐츠

본문 제목

유니티 변수의 여러가지 활용

UNITY C#

by 오픈플레이 2019. 7. 27. 15:14

본문

아무리 간단한 게임을 만든다고 하더라도, 게임 핵심 컨텐츠 외 다른 부수적인 컨텐츠가 필요할 때가 많습니다.

예를 들어, 데이터 처리, 게임데이터 저장, UI 표시 등등 말이죠. 분명 프로토타입 제작까지는 재미있게 하다가, 프로덕션 제작에 들어선 후 부터 스크립트가 난도질 당하는 수준까지 가게 됩니다. 특히 메소드 (또는 펑션)과 더불어 기하급수적으로 많아지는 것이 바로 변수입니다.

게임 최적화는 대개 성능향상 / 메모리 사용조절에 있다고는 하지만, 제 생각에는 스크립트의 단순화도 최적화에 포함된다고 생각합니다. 왜냐면... 특정 스크립트를 작성했다가 오랫동안 (아마 일주일 이상?)열어보지 않았을 경우, 자신이 만들었음에도 코드파악이 힘들다면 스크립팅에 문제 있다는 것을 뜻합니다. (주석과는 별개로...)

각 프로그래머들 사이에 스타일이 있는만큼, 저의 경험을 토대로 변수를 활용하는 여러가지 방법에 대해 알려드리겠습니다.


 

1. 변수의 선언 위치

아래 스크립트는 몬스터가 플레이어의 공격을 받아 체력변화와 생존여부 조건이 있는 스크립트입니다.

몬스터HP 클래스이기 때문에 플레이어의 공격력managerPlayer 클래스에서 받아오고,

몬스터가 공격을 받는 메소드인 MonsterGetHit은 다른 클래스로부터 call을 받는 것으로 가정하여, 

public으로 처리했습니다.

 

변수 Variable는 보통 코드블럭 시작전에 선언을 해서 해당 클래스 내 사용하거나,

using UnityEngine;

// 몬스터 체력관리
public class monsterHp : MonoBehaviour
{
    // monster 관련 변수 선언
    float monsterHp; // 몬스터 체력
    bool monsterAlive; // 몬스터 생존여부
    
    // ** 플레이어 공격력 **
    float playerAtkDmg;
   
    // 몬스터가 공격을 받음
    public void MonsterGetHit()
    {
       // 플레이어 공격력 변수 접근
       playerAtkDmg = managerPlayer.playerAttackDamage;
    
       // 몬스터체력 - 플레이어 공격력 계산
       monsterHp = monsterHp - playerAtkDmg;
       
       // 몬스터 체력이 0 이상이면
       if ( monsterHp  > 0 )
       {
          monsterAlive = true; // 생존
       } else
       {
          monsterAlive = falce; // 쥬금
       }
    }
}

 

클래스 전체 또는 다른 클래스 접근이 필요없다면 코드블럭 내에 선언하여 사용하죠.

using UnityEngine;

// 몬스터 체력관리
public class monsterHp : MonoBehaviour
{
    // monster 관련 변수 선언
    float monsterHp; // 몬스터 체력
    bool monsterAlive; // 몬스터 생존여부
    
    // 몬스터가 공격을 받음
    public void MonsterGetHit()
    {
        // ** 플레이어 공격력 **
        float playerAtkDmg = 0f;
        // 플레이어 공격력 변수 접근
        playerAtkDmg = managerPlayer.playerAttackDamage;
        
        // 몬스터체력 - 플레이어 공격력 계산
       monsterHp = monsterHp - playerAtkDmg;
        
        // 몬스터 체력이 0 이상이면
       if ( monsterHp  > 0 )
       {
          monsterAlive = true; // 생존
       } else
       {
          monsterAlive = falce; // 쥬금
       }
         Debug.Log ("Monster Attack");
    }
}

 

두 스크립트의 차이점은

플레이어의 공격력 변수인 playerAtkDmg가 클래스 전반에 걸쳐 두루 사용되느냐,

또는 특정 메소드에서만 사용되느냐에 따라 변수의 선언위치를 적절하게 사용하면 되겠지요.


 

2. 파라미터 변수

몬스터의 체력을 변화 시킬 수 있는 또 하나의 방법은 메소드 파라미터를 사용하는 것입니다.

MonsterGetHit 메소드 괄호안에 float 변수 playerAtkDmg 파라미터가 적용되었으며,

이 메소드를 call 하는 스크립트에서 변수를 지정해 주어야 합니다.

using UnityEngine;

// 몬스터 체력관리
public class monsterHp : MonoBehaviour
{
    // monster 관련 변수 선언
    float monsterHp; // 몬스터 체력
    bool monsterAlive; // 몬스터 생존여부
    
    // 몬스터가 공격을 받음 (playerAtkDmg 파라미터)
    public void MonsterGetHit(float playerAtkDmg)
    {
        
        // 몬스터체력 - 플레이어 공격력 계산
       monsterHp = monsterHp - playerAtkDmg;
        
        // 몬스터 체력이 0 이상이면
       if ( monsterHp  > 0 )
       {
          monsterAlive = true; // 생존
       } else
       {
          monsterAlive = falce; // 쥬금
       }
         Debug.Log ("Monster Attack");
    }
}

이렇게 하면 플레이어의 공격력에 대한 변수 변화가 다른 클래스에서 처리되고 넘어오기 때문에

해당 클래스가 간결해지는 장점이 있습니다.


 

3. 변수 내에서 몬스터의 체력 및 생존여부 결정

몬스터의 체력처리의 궁극적인 결과물은 '이 몬스터가 죽었냐 / 살았냐'를 판별해야 하므로,

bool 변수 내에서 처리를 한 다음 리턴값을 넘기는 방식도 괜찮은 방식입니다.

using UnityEngine;

// 몬스터 체력관리
public class monsterHp : MonoBehaviour
{
    // monster 관련 변수 선언
    float monsterHp; // 몬스터 체력
    
    // 몬스터 생존여부 (playerAtkDmg 파라미터)
    public bool monsterAlive(float playerAtkDmg)
    {
        // 몬스터체력 - 플레이어 공격력 계산
       monsterHp = monsterHp - playerAtkDmg;
        
        // 몬스터 체력이 0 이상이면
       if ( monsterHp  > 0 )
       {
          return true; // 생존 리턴
          
       } else
       {
          return falce; // 쥬금 리턴
       }
         Debug.Log ("Monster Attack");
    }
}

앞서 살펴본 스크립트와는 달리 void 메소드를 쓰지 않고 public bool 변수를 활용하여

몬스터의 체력변화와 생존여부의 리턴값을 받게끔 한번에 처리 된 예시 입니다.

코드도 많이 짧아진 만큼, 내용도 쉽게 보입니다.

 

수고하셨습니다.

더 좋은 방법이 있다면 댓글을 통해 알려주시면 감사드리겠습니다.

관련글 더보기

댓글 영역