무지성으로 코드 짜고 있는데 맞게 하는 건지 모르겠음.
유지 보수성을 늘리라 그러는데 무슨 말인지도 모르겠고.
일단 최대한 구글링해서 해봤는데 코드 평가 좀.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class fight_manager : MonoBehaviour //싸움을 시작할때, 활성화. 싸움이 끝날때 비활성화
{
public static bool war_doing = false;
singleton singleton = singleton.get_singleton(); //데이터 관리 싱글톤
attack_code attack = attack_code.get_attack_code_singleton(); //공격 함수 싱글톤
skill_code effect = skill_code.get_skill_code_singleton(); // 효과 함수 싱글톤
public static List<skill_data> situation_fight_start = new List<skill_data>(); //상황 저장 함수
bool situation_fight_start_bool = false; //상황 시 켜지는 변수
int damage_plus = 0; //데미지 더하기 뺴기. 0이 기본
int damage_multi = 1; // 데미지 곱하기 나누기. 1이 기본
int damage_fix = 0; //고정 피해 0에서 1까지 있음. 0이 0 프로 1가 100프로
//데미지 게산법 -> 데미지 * (1 - damage_fix) * damage_multi + 데미지 * damage_fix
float timer = 0; //전투 시간
int time_multi = 1; //전투 배속
char_block char_block = char_block.get_char_block();
public Queue<singleton.remind> remind_act = new Queue<singleton.remind>();
//전투 상황 기억하는 큐(선입선출)
// Start is called before the first frame update
void Start()
{
{ //에시 케릭터 생성1
fight_personal_data team1_example = new fight_personal_data();
team1_example.original_hp = 150;
team1_example.level = 3;
team1_example.original_damage = 5;
team1_example.original_move_speed = 1;
team1_example.skill_piece_now = 0;
team1_example.skill_piece_full = 5;
team1_example.x_position = 3;
team1_example.y_position = 3;
team1_example.this_job = fight_personal_data.job.spearman;
team1_example.range = fight_personal_data.range_type.range_in;
team1_example.team_type = fight_personal_data.team.team1;
team1_example.name = "team1_example";
come_in_battlefield(team1_example);
}
{ //에시 케릭터 생성2
fight_personal_data team2_example = new fight_personal_data();
team2_example.original_hp = 150;
team2_example.level = 3;
team2_example.original_damage = 5;
team2_example.original_move_speed = 1;
team2_example.skill_piece_now = 0;
team2_example.skill_piece_full = 5;
team2_example.x_position = 5;
team2_example.y_position = 2;
team2_example.this_job = fight_personal_data.job.spearman;
team2_example.range = fight_personal_data.range_type.range_out;
team2_example.team_type = fight_personal_data.team.team2;
team2_example.name = "team2_example";
come_in_battlefield(team2_example );
}
StartCoroutine(fight_rutine());
}
// Update is called once per frame
void Update()
{
timer = Time.deltaTime * time_multi;
//타이머 돌아가게 하는 코드. time_multi는 불러오기 위해 시간 배속에서 씀.
for (int i = singleton.battlefield.Count -1; i >=0; i--)
{
if (singleton.battlefield[i].hp <= 0)
{
if (singleton.battlefield[i].team_type == fight_personal_data.team.team1)
{
singleton.team_1.Remove(singleton.battlefield[i]);
}
else if (singleton.battlefield[i].team_type == fight_personal_data.team.team2)
{
singleton.team_2.Remove(singleton.battlefield[i]);
}
singleton.battlefield.Remove(singleton.battlefield[i]); //전체 전장, battlefield에서도 삭제
}
if (remind_act.Count !=0) //오류 방지용
{
if (remind_act.Peek().time <= timer) //전투에 참가하는 기록으로 전투 재현.
{
if (remind_act.Peek().remind_Type == singleton.remind_type.Char) //나오는 게 케릭터 타입인가
{
fight_personal_data target = remind_act.Peek().summon_target;
come_in_battlefield(target);
remind_act.Dequeue();
}
else if (remind_act.Peek().remind_Type == singleton.remind_type.effect) //나오는 게 효과 타입(물약, 기타 등등 )인가
{
effect_make(remind_act.Peek().skill_summon_target,remind_act.Peek().situation);
remind_act.Dequeue();
}
}
}
}
void skill_shield(fight_personal_data target)
{
}
int order = 0;
IEnumerator fight_rutine()
{
while (singleton.team_1.Count != 0 && singleton.team_2.Count != 0)
{
try
{
fight_personal_data this_char = singleton.battlefield[order];
if (this_char.range == fight_personal_data.range_type.range_out) //원거리 케릭터가 타겟 정하기
{
this_char.target = get_target_out(this_char.x_position,this_char.y_position,this_char.team_type);
}
else if (this_char.range == fight_personal_data.range_type.range_in) //단거리 케릭터가 타겟 정하기
{
(int x,int y) position = get_target_in_go(this_char.x_position,this_char.y_position,this_char.team_type);
yield return new WaitForSeconds((0.5f/time_multi)/this_char.move_speed_now); //이동시간 때문에 기다림
Debug.Log(position.x);
Debug.Log(position.y);
move(singleton.battlefield[order], position.x, position.y);
this_char.target = get_target_in(this_char.x_position, this_char.y_position, this_char.team_type);
}
Debug.Log(this_char.name + ";" + this_char.target.name + ";" + this_char.x_position + ";" + this_char.y_position);
char_block.block_appear(char_block.direct.left);
yield return new WaitForSeconds(0.5f);
char_block.block_disappear( );
switch (this_char.this_job) //직업 따라 공격 다르게
{
case fight_personal_data.job.spearman: attack.spearman_attack(this_char, this_char.target,damage_fix,damage_multi,damage_plus); break;
}
}
finally
{
if (order == singleton.battlefield.Count - 1)
{
order = 0;
}
else
{
order++;
}
}
}
}
- dc official App
해당 댓글은 삭제되었습니다.
오 ㄱㅅ. 내일 한 번 찾아봄. 근데 네이밍만 바꾸면 됨? 코드 구성같은 건 저대로도 ㄱㅊ? - dc App
일단 나는 개인적으로 게임을 만드는데 있어서 돌아가기만 하면 그만이고 아무리 코드를 깔끔하게 짜고 확장성이 어쩌고 짰다고 해도 게임을 재미있게 만드는게 더 중요하다고 생각함. 그래서 코드 평가를 하는거에 굳이 큰 의미를 두지 않는데 그냥 내가 짠다고 생각하면
일단 team1과 team2를 저렇게 분리하지 않을것 같음 그냥 전체 큰 team 하나로 볼거 같음. 그래서 저 start 함수 부분에 들어가는 변수값 세팅을 따로 빼서 구현할것 같음. 그리고 큰 team 하나로 보고 있기 때문에 team의 타입을 검사하는 if 분기는 singleton.battlefield[i].hp <= 0 이 분기 1개면 충분하다고 생각됨 그래서 singleton.battlefield[i].team_type 을 검사하는 if문을 다 날릴것 같음 그다음에 역시 캐릭터 타입인지 효과 타입인지 분기하는 if문도 합쳐서 구현할것 같음 그리고 원거리 타입인지 근거리 타입인지 세부적으로 나누지 않을것 같음
fight_manager에서 너무 많은 일은 하는 것 같음. 직업에 따라 다르게 하고 싶으면, Ranger, Tanker, Attacker 이런 클래스 만들어서 공격하고, 공격 한 걸 fight_manager의 함수 호출햐서 천투 기록하면 될 듯.
job의 작업을 나중에 바꾸고 싶을 때 문제가 있을 것 같음. this_job의 스위치문을 사용하는데 이렇게 하면 나중에 새로운 job을 추가할 때 이런식으로 스위치문을 쓴 모든 코드에 들어가서 수정해야 되는데 대단히 관리하기 힘듬. 윗 댓글처럼 직업 버츄얼 클래스를 만들고 그걸 상속받아서 사용하면 더 쉽게 관리할 수 있을 듯 함
색깔 없으니까 읽기가 싫다..
소문자페티시임?