공부/인프런 - Rookiss

Part 3-13-2. 미니 RPG : 스탯 설정, 마우스 커서 변경

셩잇님 2023. 8. 30. 15:14
반응형

 

 

미니 RPG

 

스탯
📜Stat 👉 스탯을 가지는 모든 것들이 공통적으로 가지는 속성들
📜PlayerStat 👉 Stat을 상속 받음. 플레이어의 스탯 (플레이어 오브젝트에 붙는다.)
📜MonsterStat 👉 Stat을 상속 받음. 몬스터의 스탯 (몬스터 오브젝트에 붙는다)

 

📜Stat

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

public class Stat : MonoBehaviour
{
    // 멤버 변수
    [SerializeField]
    protected int _level;
    [SerializeField]
    protected int _hp;
    [SerializeField]
    protected int _maxHp;
    [SerializeField]
    protected int _attack;
    [SerializeField]
    protected int _defense;
    [SerializeField]
    protected float _moveSpeed;

    // 멤버 프로퍼티
    public int Level { get { return _level; } set { _level = value; } }
    public int Hp { get { return _hp; } set { _hp = value; } }
    public int MaxHp { get { return _maxHp; } set { _maxHp = value; } }
    public int Attack { get { return _attack; } set { _attack = value; } }
    public int Defense { get { return _defense; } set { _defense = value; } }
    public float MoveSpeed { get { return _moveSpeed; } set { _moveSpeed = value; } }

    private void Start()
    {
        _level = 1;
        _hp = 100;
        _maxHp = 100;
        _attack = 10;
        _defense = 5;
        _moveSpeed = 5.0f;
    }
}

 

몬스터 플레이어 구분없이 스탯의 공통 요소 👉 레벨, 현재 HP, 최대 HP, 공격력, 방어력, 이동 속도

 

📜PlayerStat

플레이어인 unityChan 오브젝트에 붙여준다.

 

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

public class PlayerStat : Stat
{
    [SerializeField]
	protected int _exp;
    [SerializeField]
	protected int _gold;

	public int Exp { get { return _exp; } set { _exp = value; } }
	public int Gold { get { return _gold; } set { _gold = value; } }

	private void Start()
	{
		_level = 1;
		_hp = 100;
		_maxHp = 100;
		_attack = 10;
		_defense = 5;
		_moveSpeed = 5.0f;
		_exp = 0;
		_gold = 0;
	}
}

 

Stat으로부터 상속 받은 것에 더해서 플레이어의 개인 스탯 👉 경험치, 돈

📜Define

public class Define
{
    public enum Layer
    {
        Monster = 8,
        Ground = 9,
        Block = 10,
    }

 

📜PlayerController

PlayerStat _stat;

	public enum PlayerState
	{
		Die,
		Moving,
		Idle,
		Skill,  // ✨추가! (치유 스킬, 공격 스킬 등등)
	}

	void Start()
    {
		_stat = gameObject.GetComponent<PlayerStat>();

		//...
	}

    void UpdateMoving()
    {
        //... 
		else
		{
			float moveDist = Mathf.Clamp(_stat.MoveSpeed * Time.deltaTime, 0, dir.magnitude);
    }

 

 


 

 

마우스 커서
마우스 커서 에셋 또한 에셋스토어에 많다!

경우에 따라 커서의 모습을 2 가지로 할 것이다.

1. 일반적일 떄의 마우스 커서 모습 👉 손 모양 커서

2. 보스에 커서를 가져다댔을 때의 커서 모습 👉 칼 모양 커서

 

커서 이미지

 

커서 이미지의 타입을 Cursor로 설정한다.

 

커서 적용하기

 

 

Project Settings - Player - Default Cursor 에서 디폴트 커서 이미지를 적용시킬 수 있다. 위와 같이 손쉽게 커서를 바꾸는 방법도 있지만 우리는 경우에 따라 커서의 모습을 다르게 할 것이기 때문에 코드에서 설정하여 작업한다.

 

📜PlayerController

public class PlayerController : MonoBehaviour
{
    Texture2D _attackIcon;
    Texture2D _handIcon;

    enum CursorType
	{
		None,
		Attack,
		Hand,
	}

	CursorType _cursorType = CursorType.None;

    void Start()
    {
        _attackIcon = Managers.Resource.Load<Texture2D>("Textures/Cursor/Attack");
        _handIcon = Managers.Resource.Load<Texture2D>("Textures/Cursor/Hand");
    }

    void Update()
    {
        UpdateMouseCursor();
        
        // ...
    }

    void UpdateMouseCursor()
    {
		Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

		RaycastHit hit;
		if (Physics.Raycast(ray, out hit, 100.0f, _mask))
		{
			if (hit.collider.gameObject.layer == (int)Define.Layer.Monster)
			{
				if (_cursorType != CursorType.Attack)
				{
					Cursor.SetCursor(_attackIcon, new Vector2(_attackIcon.width / 5, 0), CursorMode.Auto);
					_cursorType = CursorType.Attack;
				}
			}
			else
			{
				if (_cursorType != CursorType.Hand)
				{
					Cursor.SetCursor(_handIcon, new Vector2(_handIcon.width / 3, 0), CursorMode.Auto);
					_cursorType = CursorType.Hand;
				}
			}
		}
	}
}

 

Texture2D 👉 2D 텍스처. 이 타입으로 커서이미지 로드할 것.

_attackIcon : 공격 때 커서 텍스처

_handIcon : 땅에 가져다 댔을 때 커서 텍스처

 

CursorType : 커서 상태를 enum으로 관리

 

Start

_attackIcon, _handIcon 에 커서 텍스처 로드

 

UpdateMouseCursor

1. 게임 화면에 클릭한 곳이 몬스터일 경우 👉 _attackIcon 커서로 세팅

2. 게임 화면에 클릭한 곳이 몬스터가 아닐 경우 👉 _handIcon 커서로 세팅

3. 커서가 너무 빈번히 계속해서 세팅되면 깜빡 깜빡 거린다.

  • if (_cursorType != CursorType.Attack), if (_cursorType != CursorType.Hand) 과정을 해주면 진짜 변경되야 할 때만 세팅되므로 이런 현상이 사라진다.
  • 위 조건 처리를 안해주면 매프레임마다 Cursor.SetCursor 가 실행되는거나 마찬가지이기 때문에 계속 세팅되서 커서가 계속 깜빡거리게 된다. ㅠㅠ

 

Cursor.SetCursor(커서이미지, 커서포인트 위치, 커서 모드)

 

첫 번째 인수 👉 커서의 Texture2D 이미지

 

 

두 번째 인수 👉 마우스 커서 위치가 될 곳

마우스 이미지의 왼쪽 상단(빨간점) 부분이 좌표로 (0, 0)이 된다. 칼 끝과 손가락 끝을 커서의 위치 좌표 기준점으로 지정하는 것이 좋겠으니 (_attackIcon.width / 5, 0) 만큼, 즉 대충 너비의 1/5 정도 더 이동한 좌표를 커서의 기준점 좌표로 삼는다.

 

세 번재 인수 👉 커서의 모드

Cursor.Auto : 하드웨어의 커서를 사용 👉 윈도우 커서에 이미지를 입혀 사용하게 된다.

Cursor.ForceSoftware : 소프트웨어에서 커서를 그려서 사용

 

 

 

반응형