본문 바로가기
개발/Unity

유니티 스크립트 추상 클래스와 상속

by 피로물든딸기 2022. 3. 10.
반응형

Unity 전체 링크

 

더블클릭을 하면 연결된 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:

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Unity Pro:

 

Unity Pro

The complete solutions for professionals to create and operate.

unity.com

 

Unity 프리미엄 학습:

 

Unity Learn

Advance your Unity skills with live sessions and over 750 hours of on-demand learning content designed for creators at every skill level.

unity.com

반응형

댓글