미니 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. 보스에 커서를 가져다댔을 때의 커서 모습 👉 칼 모양 커서
커서 이미지
커서 적용하기
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 : 소프트웨어에서 커서를 그려서 사용
'공부 > 인프런 - Rookiss' 카테고리의 다른 글
Part 3-13-4. 미니 RPG : 공격 (0) | 2023.08.31 |
---|---|
Part 3-13-3. 미니 RPG : 타겟 락온 (0) | 2023.08.31 |
Part 3-13-1. 미니 RPG : 환경 설정, 이동 (0) | 2023.08.30 |
Part 3-12-1. Data : Json을 이용한 Data Manager (0) | 2023.08.29 |
Part 3-11-1. Corutine : 코루틴 최적화, 커스텀 (1) | 2023.08.29 |