2023/07/20 TIL

김도현·2023년 7월 20일
0

TIL

목록 보기
3/76

금일 한 것

[스파르타코딩클럽] 게임개발 종합반 - 3주차

금일 배운 것

1.HP구현

HP바를 구현하기 위해 칸을 표시할 back과 남은 피를 표시할 front를 만든다
Hp의 줄어듬을 표현하기 위해 front의 앵커(Anchors)의 피벗(Privot)을 0(기본값 0.5) 으로 수정
(이유: 0.5일때는 중심을 기준으로 크기가 변경되지만 0으로 수정된 상태에서는 왼쪽을 기준으로 크기가 줄어듬)

2.위로 올라가는 탄
Food(탄)과 Cat(몹)의 충돌구현을 위해 Food에 Circle Collider 2D와 Rigidbody 2D를 넣어줘야 된다. 하지만 Rigidbody 2D는 중력에 영향을 받기 때문에 설정을 바꿔줘야 된다.
(바디 타입을 Dynamic(기본값)을 Kinematic(키네마틱: 중력영향을 안받음)으로 수정)

하지만 Kinematic의 단점으로 OnTriggerEnter2D로 Collider2D의 충돌 감지 정확성이 낮아짐
해결방법 Collider2D에서 Is Trigger(트리거)를 On

3.마우스에 따라 이동하며 벽으로 인해 이동 제한 구현

void Update()
{
	Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
	float x =mousePos.x;
	if (x > 8.5f)
	{
		x = 8.5f;
	}
	if (x < -8.5f)
	{
		x = -8.5f;
	}
	transform.position = new Vector3(x, transform.position.y, 0);
}
  1. 기본 몬스터 베이스에 타입별 추가를 통해 등급 구분
public int type;
	void Update()
    {
        if(energy < full)//배고픔이 풀이 아닐때
        {
            if(type == 0) 
            {
                transform.position += new Vector3(0, -0.05f, 0);//이동속도
            }
            else if(type == 1)
            {
                transform.position += new Vector3(0, -0.03f, 0);
            }
            else if (type == 2)
            {
                transform.position += new Vector3(0, -0.1f, 0);
            }

            if (transform.position.y < -16f)
            {
                gameManager.I.gameOver();
            }
        }
        else
        {
            if (transform.position.x > 0)
            {
                transform.position += new Vector3(0.05f, 0, 0);//기준점인 x값이 양수일 때 오른쪽으로 이동하며 퇴장
            }
            else
            {
                transform.position += new Vector3(-0.05f, 0, 0);//기준점인 x값이 0과 음수일 때 오른쪽으로 이동하며 퇴장
            }
            Destroy(gameObject,3.0f); // 퇴장시 3초뒤에 사라짐
        }
        
    }

5.충돌에 관한 소스(cat.cs)

void OnTriggerEnter2D(Collider2D coll)
    {
        if (coll.gameObject.tag == "food")
        {
            if (energy < full)
            {
                energy += 1.0f;
                Destroy(coll.gameObject);//cat과 food가 충돌시 food를 삭제
                gameObject.transform.Find("hungry/Canvas/front").transform.localScale = new Vector3(energy / full, 1.0f, 1.0f); //체력바 조절
            }
            else
            {
                if(isFulll == false)
                {
                    gameManager.I.addCat(); //레벨업을 위해 cat값을 기록
                    gameObject.transform.Find("hungry").gameObject.SetActive(false);
                    gameObject.transform.Find("full").gameObject.SetActive(true);
                    isFulll = true; //이미지 변경을 한번만 실행하기 위해 bool값 전환
                }
            }
            
        }
    }

6.처치한 고양이 수를 기록하여 레벨업 관련 소스

public void addCat()
    {
        cat++;
        level = cat / 5;

        levelText.text = level.ToString();
        levelFront.transform.localScale = new Vector3((cat - level * 5) / 5.0f, 1.0f, 1.0f);
    }

7.레벨업으로 인해 고양이 생성 수 변화(레벨 난이도 설정)

    void makeCat()
    {
        Instantiate(normalCat);
        if(level == 1)
    {
            float p = Random.Range(0, 10);
            if (p < 2) Instantiate(normalCat);
        }
        else if (level == 2)
        {
            float p = Random.Range(0, 10);
            if (p < 5) Instantiate(normalCat);
        }
        else if (level == 3)
        {
            float p = Random.Range(0, 10);
            if (p < 6) Instantiate(normalCat);
            Instantiate(fatCat);
        }
        else if (level >= 4)
        {
            float p = Random.Range(0, 10);
            if (p < 7) Instantiate(normalCat);
            Instantiate(fatCat);
            Instantiate(pirateCat);
        }
    }

금일 과제

string "12ab34"를 int형 "1234"로 출력하는 것
내가 짠 코드

string input = "12ab34";
int output;
char c = 'a';

for (int i = 0; i < 26; i++)
{
    input = input.Replace(c, ' ');
    c++;
}
input = input.Replace(" ", "");
output = Convert.ToInt32(input);
Console.WriteLine(output);

구글에서 찾은 코드 1번 째

//(\d는 숫자, \D는 숫자가 아닌 문자)
using System.Text.RegularExpressions;
{
    string input = "12ab34";
    Console.WriteLine(Regex.Replace(input, @"\D", ""));
}

구글에서 찾은 코드 2번 째

{
    string number = "12ab34";
    string empty_str = string.Empty; //Empty는 ""와 비슷하지만 객체(object)를 생성하지 않음
    for (int i = 0; i < number.Length; i++)
    {
        if (Char.IsDigit(number[i])) //문자가 숫자인지 구별하는 매서드(char타입을 넣어야됨)
            empty_str += number[i];
    }
    Console.WriteLine(empty_str);
}

금일 느낀 점

사람마다 짠 코드가 너무 달라 신기했으며 클래스나 메서드를 잘 이용하면 수월하게 짤수있다는 것을 느낌.
메모리를 적게 사용하기 위해 초기화시 NULL과 Empty를 자주 사용해야겠다는 생각을 했음.

다른사람이 짠 코드

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Study
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string input = Console.ReadLine();
            string result = "";
            for (int i = 0; i < input.Length; ++i)
            {
                char c = input.ElementAt(i);
                if (IsNumber(c))
                {
                    result += c;
                }
            }
            Console.WriteLine("입력: {0}", input);
            Console.WriteLine("결과: {0}", result);
        }
        static bool IsNumber(char c)
        {
            return c >= '0' && c <= '9';
        }
    }
}

using System;
using System.Text.RegularExpressions;
public class Program
{
    public static void Main()
    {
        string input = "12ab34";
       // string input = Console.ReadLine();
        string output = Regex.Replace(input, @"\D", "");//정규표현식 사용
        Console.WriteLine(output);
        // 출력 결과: 1234
    }
}

using System.IO;
using System.Text.RegularExpressions;
string input = "12ab34";
string output = "";
output = Regex.Replace(input, @"\D", "");
Console.WriteLine(output);

using System;
{
    string input = "12ab34";
    int output = int.Parse(input.Remove(2, 2));
    Console.WriteLine(output);
}

using System;
using System.Globalization;
string str = "12ab34";
string subStr1 = str.Substring(0, 2);
string subStr2 = str.Substring(4, 2);
Console.WriteLine(subStr1 + subStr2); (편집됨) 


using System;
class Program
{
    static void Main() {
        string input="12ab34";
        string output=input.Replace("ab","");
        Console.Write(output);
    }
}

string str = Console.ReadLine();
foreach (char strSplit in str)
{
    if ('0' <= strSplit && strSplit <= '9')
    {
        Console.Write(strSplit);
    }
}

using System;
namespace testapp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("input keyword : ");
            string keyword = Console.ReadLine();
            while (keyword.Length < 1)
            {
                Console.Write("input keyword : ");
                keyword = Console.ReadLine();
            }
            Console.WriteLine(keyword + "...Convert");
            char[] c_keyword = keyword.ToCharArray();
            int[] pre_ret = new int[keyword.Length];
            int j=0;
            for (int i=0; i<keyword.Length; i++)
            {
                try
                {
                    pre_ret[j] = Convert.ToInt32(c_keyword[i].ToString());
                    j++;
                }
                catch (FormatException ex)
                {
                }
            }
            int ret=0;
            for (int i = j-1; i >= 0; i--)
                ret += pre_ret[i] * (int) Math.Pow(10,(j-i-1));
            Console.WriteLine(ret);
            Console.ReadLine();
        }
    }
}

string a = "12ab34";
string s = "";
for(int i = 0; i < a.Length; i++)
{
    if (a[i] >= '0' && a[i] <= '9') s += a[i];
}
int result = Convert.ToInt32(s);
Console.WriteLine(result);

string Input = "12ab34";
string OutPut = "";
for (int arrnum = 0; arrnum < Input.Length; arrnum++)
{
	bool _checkNum = int.TryParse(Input[arrnum].ToString(),out int _out);
	if (_checkNum == true)
	{
		OutPut += Input[arrnum];
	}
}
Console.WriteLine(OutPut);

using System;
using System.Text.RegularExpressions;
public class sprQ
{
    public static void Main(string[] args)
    {
        string Value = "12ab34";
        string result = Regex.Replace(Value, @"\D", "");
        Console.WriteLine("input = " + "\""+ Value + "\"");
        Console.WriteLine("output = " + result);
    }
}

0개의 댓글