반응형
더블클릭을 하면 연결된 player가 공격을 한다고 가정하자.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DoubleClickTest : MonoBehaviour
{
float interval = 0.25f;
float doubleClickedTime = -1.0f;
//bool isDoubleClicked = false;
public GameObject player;
private void OnMouseUp()
{
if((Time.time - doubleClickedTime) < interval)
{
//isDoubleClicked = true;
doubleClickedTime = -1.0f;
if(player.gameObject.name == "Warrior")
{
player.GetComponent<Warrior>().slash();
}
else if(player.gameObject.name == "Archer")
{
player.GetComponent<Archer>().shootArrow();
}
}
else
{
//isDoubleClicked = false;
doubleClickedTime = Time.time;
}
}
}
Warrior를 현재 DoubleClick이 되도록 연결하였다.
Warrior와 Archer는 각각 아래의 스크립트를 가지고 있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Warrior : MonoBehaviour
{
public void slash()
{
Debug.Log("slash");
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Archer : MonoBehaviour
{
public void shootArrow()
{
Debug.Log("Shoot Arrow!");
}
}
이제 더블클릭을 하면 아래와 같이 slash가 로그에 나오게 된다.
위 코드의 문제점을 보자.
만약 새로운 코드가 추가된다면 아래와 같이 else if가 무한정 늘어나게 된다.
if(player.gameObject.name == "Warrior")
{
player.GetComponent<Warrior>().slash();
}
else if(player.gameObject.name == "Archer")
{
player.GetComponent<Archer>().shootArrow();
}
/* else if(...) */
/* else if(...) */
/* else if(...) */
따라서 Player라는 추상 클래스를 만들고, 추상 메서드로 attack()을 선언한 후,
Warrior와 Archer 외 직업들은 추상 클래스를 상속하여 각 직업별로 알맞는 attack()을 구현한다.
추상 클래스 Player는 아래와 같다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class Player : MonoBehaviour
{
public abstract void attack();
}
Warrior의 코드에는 Player를 상속하도록 한다.
추상 클래스를 상속하였으니 추상 메서드 attack을 override하여 구현하지 않으면 컴파일 에러가 난다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Warrior : Player
{
public void slash()
{
Debug.Log("slash");
}
public override void attack()
{
slash();
}
}
Archer도 아래와 같이 수정한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Archer : Player
{
public void shootArrow()
{
Debug.Log("Shoot Arrow!");
}
public override void attack()
{
shootArrow();
}
}
이제 DoubleClickTest의 아래 if문은 필요가 없어진다.
각 직업의 추상 클래스인 Player를 GetComponent로 얻으면 된다.
if(player.gameObject.name == "Warrior")
{
player.GetComponent<Warrior>().slash();
}
else if(player.gameObject.name == "Archer")
{
player.GetComponent<Archer>().shootArrow();
}
/* else if(...) */
/* else if(...) */
/* else if(...) */
따라서 아래의 한 줄로 충분하고, 매번 새로운 직업이 추가되어도 고칠 필요가 없어진다.
player.GetComponent<Player>().attack();
전체 코드는 아래와 같다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DoubleClickTest : MonoBehaviour
{
float interval = 0.25f;
float doubleClickedTime = -1.0f;
//bool isDoubleClicked = false;
public GameObject player;
private void OnMouseUp()
{
if((Time.time - doubleClickedTime) < interval)
{
//isDoubleClicked = true;
doubleClickedTime = -1.0f;
player.GetComponent<Player>().attack();
}
else
{
//isDoubleClicked = false;
doubleClickedTime = Time.time;
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class Player : MonoBehaviour
{
public abstract void attack();
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Warrior : Player
{
public void slash()
{
Debug.Log("slash");
}
public override void attack()
{
slash();
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Archer : Player
{
public void shootArrow()
{
Debug.Log("Shoot Arrow!");
}
public override void attack()
{
shootArrow();
}
}
Unity Plus:
Unity Pro:
Unity 프리미엄 학습:
반응형
'개발 > Unity' 카테고리의 다른 글
유니티 - Line Renderer로 게임 오브젝트끼리 연결하기 (연결 선 그리기) (0) | 2022.03.12 |
---|---|
유니티 Attribute - 에디터 플레이 후 씬 자동 저장 (Unity Auto Saving In Editor) (0) | 2022.03.11 |
유니티 더블 클릭 구현하기 (Unity Double Click) (1) | 2022.03.09 |
유니티 - 게임 오브젝트 기준으로 카메라 움직이기 (0) | 2022.03.07 |
유니티 - 1인칭 시점 조작 first person view controller (0) | 2022.03.06 |
댓글