이 게임 유니티로 구현해보려고 하는 중 입니다...
작은 프로젝트지만 그래도 이것 저것 써보려고 이것저것 시도해서 하는데.. 이게 잘한 짓인지 모르겠습니다
유니티로 혼자 뭘 만들어 본 게 처음이라;
혹시 이렇게는 잘 안 한다든가 이건 굳이 할 필요가 없다던가 하는 것이 있으면 지적해주실 수 있으신가 해서 질문 드립니다
전체적인 스크립트 구성은
Unit ->Petal ->
->Mob ->Beetle
->Ladybug
->Player ->PlayerStats
->PlayerMove
이렇게 Unit을 기본적으로 상속해서 공통된 사항을 구하는 식을 정의,
Petal, Mob, Player별로 다른 리턴 방식을 갖고
거기서 또 Petal과 Mob은 종류별로 각각 다르게 동작, 스탯 받기를 하려고 합니다
인게임 내 오브젝트가 모두 가지고있는 스탯을 interface화 했습니다
STATUS.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public interface STATUS //몹, 무기, 플레이어가 기본적으로 모두 가진 스탯 { float HP { get; } float POW { get; } float DEF { get; } } |
GRADES.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public enum GRADES { Common, Rare, Epic, Legendary } |
Unit.cs
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public abstract class Unit : MonoBehaviour, STATUS { public float HP { get; private set; } public float POW { get; private set; } public float DEF { get; private set; } protected virtual void InputStatus(GRADES grade, float strong) //스탯 넣기 { //등급(grade), 몹의 종류별 스탯 계수(strong)로 스탯 생성. 플레이어는 레벨 HP = GetHP(grade, strong); POW = GetPOW(grade, strong); DEF = GetDEF(grade, strong); } protected abstract float GetHP(GRADES grade, float strong); protected abstract float GetPOW(GRADES grade, float strong); protected abstract float GetDEF(GRADES grade, float strong); } |
Mobs.cs
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using Unity.VisualScripting; using UnityEditor.PackageManager; using UnityEngine; using static TMPro.SpriteAssetUtilities.TexturePacker_JsonArray; public class Mobs : Unit { static readonly float mobHP = 375f;//기본 체력 375 static readonly float mobPOW = 30f;//기본 공격력 30 static readonly float mobDEF = 2f;//기본 방어력 2 static readonly float rev = 3.75f;//등급별 체력상승 배율 3.75 protected override float GetHP(GRADES grade, float strong) { float hp = mobHP;//체력 375f float thousand = 0.001f; //단위가 어떻든 앞 3자릿수만 표기하고 뒤는 반올림하기 위한 변수 float middle; //계산 중간값 저장 float result; int count = 0; for (int i = 0; i < (int)grade; ++i) { hp *= rev;//등급이 한 단계씩 오를수록 체력 3.75배 증가 } if ((int)grade == GRADES.GetValues(typeof(GRADES)).Length-1) hp *= 2; //Legendary는 체력 2배 더 middle = Mathf.Round(hp * strong); for (; 1 < middle * thousand;)//앞 3자리 이후는 0으로 만드는 식 { middle = Mathf.Round(middle * 0.1f); ++count; } for (int i = 0; i < count; ++i) { middle *= 10; } result = middle; return result; } protected override float GetPOW(GRADES grade, float strong) { return mobPOW; } protected override float GetDEF(GRADES grade, float strong) { return mobDEF; } protected GRADES GetGrade()//랜덤 등급 넣기 { int len = GRADES.GetValues(typeof(GRADES)).Length; return (GRADES)UnityEngine.Random.Range(0, len); } } |
Beetle.cs
using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine; public class Beetle : Mobs { GRADES grade; //몹의 등급, 랜덤받기 readonly float strong = 1.33f; //Beetle의 계수 (다른 몹보다 스탯이 1.33배 강함 private void Start() { grade = GetGrade(); InputStatus(grade, strong); Debug.Log(HP); } } |
PlayerMove.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMove : Player { float speed = 6f;//플레이어 이속 float vI, hI;//vertical Input, horizontal Input Rigidbody2D rb2D; Vector2 moveVector = Vector2.zero; void Start() { rb2D = GetComponent<Rigidbody2D>(); } private void FixedUpdate() { rb2D.AddForce(moveVector * speed, ForceMode2D.Force); } void Update() { PlayerMoveInput(); } void PlayerMoveInput() { hI = Input.GetAxis("Horizontal"); vI = Input.GetAxis("Vertical"); moveVector = new Vector2(hI, vI); if (moveVector.sqrMagnitude > 1) moveVector.Normalize();
} } |
오브젝트끼리 충돌했을때 뒤로 밀리는걸 적용해볼라고 충돌 시 충격량 계산하려고 했다가 쓸데없는짓이란걸 깨닫고 하루를 그냥 날렸습니다.
그냥 탄성계수 좀 높히면 알아서 계산해서 튕겨지는데 바보같이..
일단 여기까지 했고 나머지는 만들고있습니다..