728x90
슬롯을 만들다 보니 뭔가 이상한점을 발견했다.
이렇게 툴팁이 가려진다...
Canvas의 하위 객체들은 전체가 Canvas의 정렬 기준을 따른다. Canvas의 Sorting Layer를 수정하면 하위 객체 전체의 정렬기준이 설정되기 때문이다.
그래서 다른 방법을 고안해냈는데 다음과 같이 수정해주자.
일단 아이템 슬롯에서 툴팁을 제거해주자.
이렇게 툴팁을 바깥으로 빼주었다. 이전 설정은 전부 같다.
그리고 슬롯의 SlotManager 스크립트를 보면, 이전에 툴팁을 띄울때는 넣어서 해결해줬지만, 이번에는 프리팹을 생성할때, 오브젝트를 검색해서 자동으로 넣어줄 수 있도록 해볼것이다.
public class SlotManager : MonoBehaviour
{
//중략, 변수들을 선언한 부분이다.
[SerializeField] GameObject tooltip;
[SerializeField] Text tooltipText;
private void Start() {
tooltip = GameObject.Find("ToolTip");
tooltipText = GameObject.Find("ToolTipText").GetComponent<Text>();
}
private void OnMouseOver() { //마우스가 올려졌을 때.
//중략 아래는 함수를 선언한 부분들이다.
}
GameObject 클래스의 하위 함수에는 오브젝트를 검색하는 기능이 있다. 단 주의할점은, 오브젝트의 이름을 대,소문자 정확히 틀리지 않고 작성해야 검색할 수 있다.
이렇게 하고 게임을 다시 실행해보면 툴팁이 가려지지 않고 잘 뜨는것을 볼 수 있다.
이제 다시 마우스 위치에 따라 툴팁의 위치를 변경할 수 있도록 수정해보자.
툴팁을 적용할때, 우리는 아이템 습득 시 얻어진 Slot에다가 Tooltip과, TooltipText를 넣어줘야한다.
그래서 코드를 조금 더 수정해야한다.
//PlayerManager 코드추가
//아이템 습득
private void OnTriggerStay2D(Collider2D other) {
if(other.tag == "Item"){ //태그 확인
if(Input.GetKey(KeyCode.Space)){ //아이템 습득 키 확인
GameManager.Instance.AddInventoryItem(other.GetComponent<ItemManager>().ReturnItem()); //인벤토리에 아이템 추가
GameObject go = ObjectPoolingManager.Instance.GetQueue(ObjectPoolingManager.Instance.slotQueue); //미리 만들어둔 오브젝트를 가져옴
go.GetComponent<SlotManager>().SetItem(other.GetComponent<ItemManager>().ReturnItem()); //슬롯에 추가할 아이템 정보 받아오기.
go.transform.GetChild(0).GetComponent<Image>().sprite = other.GetComponent<SpriteRenderer>().sprite; //이미지 변경
//이부분이 추가됨
go.GetComponent<SlotManager>().SetTooltipObj(GameManager.Instance.tooltip); //툴팁 오브젝트 설정
go.GetComponent<SlotManager>().SetTooltipTextObj(GameManager.Instance.tooltipText); //툴팁 텍스트 설정
go.transform.SetParent(GameManager.Instance.cropsParent); //부모 변경
Destroy(other.gameObject); //인벤토리에 추가해줬으니, 오브젝트를 삭제
}
}
}
//SlotManager 코드 변경
public class SlotManager : MonoBehaviour
{
#region Instance
private static SlotManager _instance;
public static SlotManager Instance{
get{
if(_instance == null) _instance = FindObjectOfType(typeof(SlotManager)) as SlotManager;
return _instance;
}
}
#endregion
[SerializeField] Item item;
[SerializeField] GameObject tooltip;
[SerializeField] Text tooltipText;
//이부분의 Start함수를 삭제했음.
//Start함수의 기능을 PlayerManager로 옮겻기 때문.
private void OnMouseOver() { //마우스가 올려졌을 때.
string str = "";
str += item.GetItemName() + "\n";
str += "갯수 : 1개" + "\n";
str += "가격 : " + item.GetItemPrice().ToString() + "\n";
str += item.GetItemInfo();
tooltipText.text = str;
//툴팁의 보정값을 위한 함수 호출하는 부분 추가.
tooltip.GetComponent<TooltipScript>().SetXYSize(tooltip.GetComponent<RectTransform>().rect.width, tooltip.GetComponent<RectTransform>().rect.height);
tooltip.SetActive(true);
}
//중략
public void SetNullItem(){ //아이템 비우기 함수(인벤에서 아이템 삭제될 시 사용)
item = null;
}
//툴팁 오브젝트를 불러오는 함수 두개 추가.
public void SetTooltipObj(GameObject _tooltip){
tooltip = _tooltip;
}
public void SetTooltipTextObj(Text _tooltipText){
tooltipText = _tooltipText;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TooltipScript : MonoBehaviour
{
[SerializeField] float x,y;
[SerializeField] Vector3 mousePos;
// Update is called once per frame
void Update()//여기서 Update를 쓰는 이유는 Active상태일때만 작동하기 때문. 마우스의 위치를 따라 다니게 하고싶음.
{
// mousePos = Input.mousePosition;
mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x + (x/2), Input.mousePosition.y + (-y/2), -Input.mousePosition.z));
this.transform.position = new Vector3(mousePos.x, mousePos.y, 0f);
}
public void SetXYSize(float _x, float _y){ //보정값을 구하기 위해 계산하는 함수 추가.
this.x = _x;
this.y = _y;
}
}
public class GameManager : MonoBehaviour
{
#region Instance
private static GameManager _instance;
public static GameManager Instance{
get{
if(_instance == null) _instance = FindObjectOfType(typeof(GameManager)) as GameManager;
return _instance;
}
}
#endregion
#region Parents
public Transform cropsParent;
#endregion
#region Tooltip //툴팁을 추가하기 위해 미리 GameManager에 추가해줌.
public GameObject tooltip;
public Text tooltipText;
#endregion
//중략
}
그리고, GameManager에 툴팁을 넣어주자.
자, 이렇게 수정해주고 게임을 실행해보자.
툴팁이 잘 뜨는것을 확인할 수 있다!
다음은 맵에 작물을 심는 작업을 추가해보자!
728x90
'Develop > 마음대로 만드는 게임' 카테고리의 다른 글
[NProject] 마음대로 만드는 게임 - 15. 작물을 심을 토양 만들기 (0) | 2024.05.27 |
---|---|
[NProject] 마음대로 만드는 게임 - 13. 슬롯 수정2 (0) | 2024.05.21 |
[NProject] 마음대로 만드는 게임 - 12. 슬롯 수정 1 (0) | 2024.05.20 |
[NProject] 마음대로 만드는 게임 - 11. 인벤토리 기능 추가 (0) | 2024.05.20 |
[NProject] 마음대로 만드는 게임 - 10. 아이템을 만들어 보자! 4 (0) | 2024.05.20 |