https://florr.io/


이 게임 유니티로 구현해보려고 하는 중 입니다...


작은 프로젝트지만 그래도 이것 저것 써보려고 이것저것 시도해서 하는데.. 이게 잘한 짓인지 모르겠습니다

유니티로 혼자 뭘 만들어 본 게 처음이라;

혹시 이렇게는 잘 안 한다든가 이건 굳이 할 필요가 없다던가 하는 것이 있으면 지적해주실 수 있으신가 해서 질문 드립니다


전체적인 스크립트 구성은

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();

        

    }

}




오브젝트끼리 충돌했을때 뒤로 밀리는걸 적용해볼라고 충돌 시 충격량 계산하려고 했다가 쓸데없는짓이란걸 깨닫고 하루를 그냥 날렸습니다.

그냥 탄성계수 좀 높히면 알아서 계산해서 튕겨지는데 바보같이..


일단 여기까지 했고 나머지는 만들고있습니다..