유니티 토막 지식_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를 수행시킨다.
게임 오브젝트 설정
Hierarchy 창에 다음과 같이 오브젝트를 만들어 준다.
-
Gun, Sword, Hammer, Attack는 버튼 오브젝트이다. UI 탭에 있다.
-
빈 오브젝트를 만들어 WeaponUI 로 이름짓고 4개의 버튼을 모두 그 자식으로 두었다. 큰 의미는 없고, 버튼을 한데 묶어주고 싶었다.
버튼을 생성하면 내부에 text 오브젝트가 같이 생성된다.
이는 버튼에 표시되는 글자를 나타내는 객체이다. 각각의 이름에 맞게 텍스트를 설정해주자.
적당히 캔버스에 배치해주도록 하자.
버튼을 한데 묶은 WeaponUI에 UIControl 스크립트 파일을 컴포넌트로 추가해주자.
이제 각 버튼에 On Click 이벤트 처리를 해주면 된다. 처음에는 empty 상태일 텐데, 다음과 같은 과정으로 추가하자.
-
+버튼을 눌러 이벤트를 추가한다.
-
WeaponUI 오브젝트를 끌어다 오브젝트 넣는 자리에 놓는다.
-
오른쪽 콤보박스를 눌러 스크립트이름을 찾아 메서드를 등록해준다.
3번은 위와 같이 해주면 된다.
게임을 실행하고 버튼을 하나씩 눌러보며 테스트해보자.