본문 바로가기
C#

[C#][Unity] 2D 오브젝트 화살표로 강조표시

by teamnova 2022. 10. 16.

안녕하세요.

오늘은 오브젝트에 다가가면 화살표로 강조표시 해주는 예제를 진행하겠습니다.

 

더보기

환경은 다음과 같습니다.

유니티 버전 - 2021.3.4f1

또한, 앞의 유니티 2D 상자열고닫기 예제와 이어지는 예제입니다.

 

 

강조표시인 하이라이트는 Interactable.cs 를 상속한 오브젝트에 화살표가 표시되게금 구현하겠습니다.

강조 표시를 원하는 오브젝트에 Interactable.cs를 상속한 스크립트를 컴포넌트 추가 하시면 원하는 오브젝트에 표시가 됩니다.

 

먼저 강조표시로 사용할 화살표 이미지를 불러옵니다.

그리고 화살표를 강조표시로 드래그해서 계층구조에 넣어주시고, 적절한 크기로 줄여주세요.

 

그런 다음, 계속해서 상속해서 사용할 Interactable 스크립트를 작성합니다.

앞서 상자 열고 닫기 예제를 진행하셨다면 이 스크립트를 이미 작성하셨을 겁니다 :)

// Interactable.cs

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

public class Interactable : MonoBehaviour
{
    public virtual void Interact(Character character){
        
    }
}

 

위의 스크립트를 상속해서 게임매니저에 사용할 하이라이트 컨트롤러 스크립트를 만듭니다.

 

//HighlightController.cs

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

public class HighlightController : MonoBehaviour
{
    [SerializeField] GameObject highlighter;
    GameObject currentTarget;

    public void Highlight(GameObject target){
        if(currentTarget == target){
            return;
        }
        Vector3 position = new Vector3(target.transform.position.x, (target.transform.position.y + 0.5f), target.transform.position.z);
        Highlight(position);
    }

    public void Highlight(Vector3 position){
        highlighter.SetActive(true);
        highlighter.transform.position = position;
    }

    public void Hide(){
        currentTarget = null;
        highlighter.SetActive(false);
    }
}

 

생성한 컨트롤러를 게임매니저에 넣어주시고 스크립트에서 정의한 SerializeField인 highlighter에 계층구조에 넣었넌 화살표를 넣어줍니다.

 

 

그 다음, 메인 캐릭터의 CharacterInteractController.cs 에 스크립트를 추가로 작성합니다.

(상자 열고닫기 예제에서 생성한 스크립트입니다.)

 

[SerializeReference] HighlightController highLightController;

private void Update(){
        Check();
    }


public void Check(){
        Vector2 position = rigid.position + characterController.lastMotionVector * offsetDistance; //캐릭터 위치, 캐릭터 방향, offset
        Collider2D[] colliders = Physics2D.OverlapCircleAll(position, sizeOfInteractableArea);

        foreach(Collider2D c in colliders){
            Interactable hit = c.GetComponent<Interactable>();
            if(hit != null){
                highLightController.Highlight(hit.gameObject);
                return;
            }
        }

        highLightController.Hide();
    }

위의 코드들을 추가하시면 됩니다.

전체 코드는 다음과 같습니다.

 

//CharacterInteractController.cs

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

public class CharacterInteractController : MonoBehaviour
{
    CharacterController2D characterController;
    Rigidbody2D rigid;
    [SerializeField] float offsetDistance = 1f;
    [SerializeField] float sizeOfInteractableArea = 1.2f;
    [SerializeReference] HighlightController highLightController;

    Character character;

    private void Awake()
    {
        characterController = GetComponent<CharacterController2D>();
        rigid = GetComponent<Rigidbody2D>();
        character = GetComponent<Character>();
    }

    private void Update(){
        Check();

        if(Input.GetMouseButtonDown(1)){
            Interact();
        }
    }

    public void Check(){
        Vector2 position = rigid.position + characterController.lastMotionVector * offsetDistance; //캐릭터 위치, 캐릭터 방향, offset
        Collider2D[] colliders = Physics2D.OverlapCircleAll(position, sizeOfInteractableArea);

        foreach(Collider2D c in colliders){
            Interactable hit = c.GetComponent<Interactable>();
            if(hit != null){
                highLightController.Highlight(hit.gameObject);
                return;
            }
        }

        highLightController.Hide();
    }

    private void Interact(){
        Vector2 position = rigid.position + characterController.lastMotionVector * offsetDistance; //캐릭터 위치, 캐릭터 방향, offset
        Collider2D[] colliders = Physics2D.OverlapCircleAll(position, sizeOfInteractableArea);

        foreach(Collider2D c in colliders){
            Interactable hit = c.GetComponent<Interactable>();
            if(hit != null){
                hit.Interact(character);
                break;
            }
        }
    }
}

 

작성을 하신 후, 캐릭터에 컴포넌트가 잘 추가가 되었다면 위에서 정의한 SerializeReferebnce인 highlightController에 게임매니저를 넣습니다.

 

 

이제 실행해보겠습니다.

 

 

 

 

원하는 오브젝트에 Interactable.cs를 상속한 스크립트를 컴포넌트로 추가한다면 위의 나무처럼 화살표가 표시되게 됩니다.