/ UNITY

유니티 토막 지식_09

오늘은 어제 알아봤던 스트래티지 패턴의 실습을 해보도록 하겠다. 정보를 찾아보면서 깨달았는데, SSAFY 자바 파트를 배우면서 비슷한 방식의 예제를 풀어본 적이 있었다.

스파이더맨과 거미 모두 거미줄을 쏠 수 있는데, 평범한 인간은 거미줄을 쏘지 못한다.

이때 스파이더맨 클래스에 거미를 has a 관계로 포함시켜줌으로써 일반적인 인간과 구별하도록 하는 것이다.

이렇게 함으로써 스파이더맨은 인간 클래스를 상속받으면서 거미의 특성을 사용할 수 있었다.

스트래티지 패턴
Weapon.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public interface Weapon
{
    public abstract void Attack();
}

먼저 Weapon 인터페이스를 선언한다. 해당 인터페이스는 추상메서드로 Attack 메서드를 가지고 있다.

무기들
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Gun : Weapon
{
    public void Attack()
    {
        Debug.Log("탕! 탕!");
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Sword : Weapon
{
    public void Attack()
    {
        Debug.Log("슈슉 슈슉. 슉.");
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Hammer : Weapon
{
    public void Attack()
    {
        Debug.Log("쾅!");
    }
}

검, 총, 망치 클래스를 각각 만들어주었고, 해당 클래스는 모두 Weapon 인터페이스와 구현 관계를 맺었다.

이렇게 되면, 객체지향의 특성중 하나인 다형성에 의해 Weapon 타입으로 3개의 무기 모두 담을 수 있게 되었다.

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

public class Actor
{
    private Weapon weapon;

    public Weapon SetWeapon
    {
        set
        {
            weapon = value;
        }
    }


    public void Attack()
    {
        weapon.Attack();
    }
}

무기를 바꿀 수 있도록 C#에 있는 기능인 프로퍼티를 통한 set 기능을 추가해주었다(자바를 배웠다보니 헷갈리긴 한다).

또, Attack 메서드를 통해 무기가 가지고있는 메서드 Attack를 실행시켜준다.

UiControl.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UiControl : MonoBehaviour
{

    private Actor actor;

    void Start()
    {
        // Actor를 생성해주고, 초기값으로 검을 설정하도록 한다.
        actor = new Actor();
        actor.setWeapon = new Sword();
    }


    // 무기를 바꾸는 함수들 설정
    public void changeSword()
    {
        Debug.Log("무기 칼로 바꾼다!");
        actor.setWeapon = new Sword();
    }
    public void changeGun()
    {
        Debug.Log("무기 총으로 바꾼다!");
        actor.setWeapon = new Gun();
    }
    public void changeHammer()
    {
        Debug.Log("무기 망치로 바꾼다!");
        actor.setWeapon = new Hammer();
    }

    // 공격 수행 메서드
    public void attack()
    {
        actor.attack();
    }

}
  • line 8 : 먼저 Actor 객체 타입 변수를 선언해준다. set함수로 세팅만 할 것이고 외부에서 접근 불가능하게 private로 선언해준다.

  • line 10 ~ 15 : start 이벤트 처리로 객체를 생성해서 할당해주고 초기값을 Sword으로 하여 초기화시켜준다.

  • line 19 ~ 33 : 무기 변경을 위한 메서드이다. 프로퍼티 방식 이용하여 actor의 weapon을 각각의 무기로 변경시켜준다. 테스트를 위해 콘솔창에 간단히 출력했다.

  • line 36 ~ 39 : 공격을 수행할 메서드이다. 역시 actor의 weapon의 메서드 attack를 수행시킨다.

게임 오브젝트 설정

Unity_01

Hierarchy 창에 다음과 같이 오브젝트를 만들어 준다.

  1. Gun, Sword, Hammer, Attack는 버튼 오브젝트이다. UI 탭에 있다.

  2. 빈 오브젝트를 만들어 WeaponUI 로 이름짓고 4개의 버튼을 모두 그 자식으로 두었다. 큰 의미는 없고, 버튼을 한데 묶어주고 싶었다.

Unity_02

버튼을 생성하면 내부에 text 오브젝트가 같이 생성된다.

Unity_03

이는 버튼에 표시되는 글자를 나타내는 객체이다. 각각의 이름에 맞게 텍스트를 설정해주자.

Unity_04

적당히 캔버스에 배치해주도록 하자.

Unity_05

버튼을 한데 묶은 WeaponUI에 UIControl 스크립트 파일을 컴포넌트로 추가해주자.

Unity_06

이제 각 버튼에 On Click 이벤트 처리를 해주면 된다. 처음에는 empty 상태일 텐데, 다음과 같은 과정으로 추가하자.

  1. +버튼을 눌러 이벤트를 추가한다.

  2. WeaponUI 오브젝트를 끌어다 오브젝트 넣는 자리에 놓는다.

  3. 오른쪽 콤보박스를 눌러 스크립트이름을 찾아 메서드를 등록해준다.

Unity_07

3번은 위와 같이 해주면 된다.

Unity_08

게임을 실행하고 버튼을 하나씩 눌러보며 테스트해보자.