공부하기싫어
article thumbnail

3월26일 오전5시 포스팅 시작

 

오늘은 화염방사기 구현과 바운스볼 판정을 수정해보고

 

시간이 더 된다면 카메라 시네머신까지 구현해보자

 

  • 화염방사기

우선 8장의 그림을 받았는데

실제 쿠크에서는 저 화염방사기가 굉장히 느리게 돌아간다

그림을 더 그려달라고 할까 하다가

실제로 돈주고 외주 맡기면 이런것도 다 돈인데 너무 그래서

그냥 했다

히트범위와 이벤트함수호출

왼쪽, 오른쪽 히트박스를 자식오브젝트로 만들어서 할당하고 이벤트함수로 on/off 했다

 

매 프레임마다

지금은 매 프레임마다 데미지를 받아서

이걸 제어해줘야겠다

그리고 피통도 5로 늘려야할듯?

3은 빡세네

 

public class fireclown : MonoBehaviour
{

    public Transform right_hit_pos; public Vector2 right_hit_boxSize;
    public Transform left_hit_pos; public Vector2 left_hit_boxSize;

    Animator animator;
    bool flame_left=false;
    bool flame_right=false;

    float left_atk_cooltime=3; float left_atk_cooltime_timer=0;
    float right_atk_cooltime=3; float right_atk_cooltime_timer=0;

    // Start is called before the first frame update
    void Start()
    {
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        if (flame_left) {
            left_atk_hit();
        } else { ;}
        if (flame_right) {
            right_atk_hit();
        } else { ;}
    }

    private void OnDrawGizmos() {
        Gizmos.color=Color.blue;
        Gizmos.DrawWireCube(right_hit_pos.position, right_hit_boxSize);
        Gizmos.DrawWireCube(left_hit_pos.position, left_hit_boxSize);
    }

     private void left_atk_hit() {
        Collider2D[] collider2Ds = Physics2D.OverlapBoxAll(left_hit_pos.position, left_hit_boxSize, 0);
        foreach (Collider2D collider in collider2Ds) {
            if (left_atk_cooltime_timer <= 0) {
                if (collider.tag == "Player") {
                    collider.GetComponent<player>().ChangeHealth(-1);
                    left_atk_cooltime_timer=left_atk_cooltime;
                }
            } else {
                left_atk_cooltime_timer-=Time.deltaTime;
            }
        }
    }

    private void right_atk_hit() {
        Collider2D[] collider2Ds = Physics2D.OverlapBoxAll(right_hit_pos.position, right_hit_boxSize, 0);
        foreach (Collider2D collider in collider2Ds) {
             if (right_atk_cooltime_timer <= 0) {
                if (collider.tag == "Player") {
                    collider.GetComponent<player>().ChangeHealth(-1);
                    right_atk_cooltime_timer = right_atk_cooltime;
                }
            } else {
                right_atk_cooltime_timer-=Time.deltaTime;
            }
        }
    }

    public void left_flame_start() {
        flame_left=true;
    }

    public void left_flame_end() {
        flame_left=false;
    }

    public void right_flame_start() {
        flame_right=true;
    }

    public void right_flame_end() {
        flame_right=false;
    }
}

 

왼쪽불꽃, 오른쪽불꽃 쿨타임을 따로 두어서 쿨타임 중복 버그를 방지했다

 

 

왼쪽맞고 오른쪽 맞고

 

 

  • 바운스볼 판정

바운스볼 판정을 어떻게 구현해야 하나 고민했었는데

처음 오브젝트가 배치된 좌표의 y값과 현재 오브젝트의 y값의 차이가 0.5 이하 일때만 데미지를 주도록 해볼생각이다.

 

처음위치에서 y값은 증가했다가 다시 처음 위치로 돌아오기때문에

처음 y값보다 더 작아질 일은 없으니까

 

void OnTriggerEnter2D(Collider2D other)
    {
        player controller = other.GetComponent<player>();
        if (pos.y-first_pos.y <= 0.5) {
            if (controller != null)
            {
                controller.ChangeHealth(-1);
            }
        }
    }

이렇게 해봤고

실행해봤는데 그 s1_1f 공의 좌표를 보니까 -2~2 정도로 움직인다.

0.5보다 더 작게 해야겠다

 

근데? 좌표가 음수일때를 생각을 못했네

흠... 절댓값 하면 안되고

수학 어렵네..

 

처음좌표 <= 현재좌표 < 처음좌표+0.1 이렇게 해야하나

 

해도 안되길래 로그로 살펴봤다

???

현재위치로 찍어놧었는데

아닌가?

그래서 새로 변수를 만들고 업데이트 에서 계속 받아오게 했는데

 

??????

아 if 조건 안바꿔줬네

ㅋㅋ

 

이게 0.5까지해도 안되길래 bounceball 의 y좌표를 좀 자세히 봤더니

초기 위치까지 y값이 안돌아온다

 

초기위치보다 +2정도되는 곳에서만 왔다갔다 하길래 조건을 2로 줬더니

이제 점프할때 맞지 않고 공이 찍을때만 데미지가 들어온다

굿

 

public class bounceball : MonoBehaviour
{
   
    public float bounceball_speed=2.5f; // 이동속도
    Vector3 pos; //현재위치
    Vector2 first_pos;
    Vector2 now_pos;
    float delta = 5.0f; // 좌(우)로 이동가능한 (x)최대값

    void Start()
    {
        pos = transform.position;
        first_pos=transform.position;
    }

    // Update is called once per frame
    void Update()
    {
        now_pos=transform.position;
        Vector3 v = pos;
        float acceleration = delta * Mathf.Abs(Mathf.Sin(Time.time * bounceball_speed));
        // 좌우 이동의 최대치 및 반전 처리를 이렇게 한줄에 멋있게 하네요.
        v.y += acceleration;

        transform.position = v;
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        player controller = other.GetComponent<player>();
        if (first_pos.y <= now_pos.y  &&  now_pos.y < first_pos.y+2) {
            if (controller != null)
            {
                controller.ChangeHealth(-1);
                Debug.Log(first_pos+" "+now_pos);
            }
        }
    }
}

 

아직 오전 8시30분인데

오늘은 저녁 7시~8시에 잘 예정이니까 조금 더 만져봐야겠다

 

생각보다 엄청 빨리 했으니까 이제 남은게

 

- 카메라 시네머신

- UI (파란공 저주 해제 포함)

- 게임시작과 게임오버 화면

- r키 재시작

 

이 정도 인것 같다. 잘하면 3차계획때 계획한 것처럼 3월달 안에 사이트에 업로드 할 수 잇을지도?

 

  • 카메라 시네머신

https://learn.unity.com/tutorial/kamera-sinemeosin?uv=2020.3&projectId=5dcdc49dedbc2a00206ce6b0

 

카메라 - 시네머신 - Unity Learn

지금까지는 한 화면에서만 게임을 실행했기 때문에 고정(static) 카메라를 사용했습니다. 이번 튜토리얼에서는 Cinemachine이라는 Unity 패키지를 이용해 코드 작성 없이 카메라를 자동으로 제어해 보

learn.unity.com

 

 

이전에 공부했었던 유니티 학습의 챕터를 보고 따라했다

 

음...

걍 이렇게만 해줬다

 

흠..

이렇게 빨간색 테두리가 생기는데 이게 뭔진 모르겠다

 

저 안에만 나온다는건가?

 

데드존

 

점프할때 카메라가 따라가길래 데드존 높이를 조금 줘서 점프에는 반응하지 않도록 했다.

 

지금이 26일 오후 1시인데

오늘은 7시에 자려고 했는데 시간이 많이 남아서

파란공의 저주 해제를 띄우는것 까지만 해보려고 한다

 

  • 저주해제

를 띄우려는데 text 에 한글 치면 ㅁㅁㅁㅁ 이렇게 나오네 ㅋㅋ

영어로 어떻게 문구가 나오나 보려고 스툽즈 영상을 보는데

https://youtu.be/4pXahbtMIvk

폭탄을 맞으면 기절하는구나?

이것도 나중에 구현해봐야겠다

 

완성!

파란공 3개를 모두 부시면 메세지박스가 2초간 나오도록 설정했다!

 

이제 저 필요없는 디버그들 다 없애고 마무리 해야지

 

 

 

오늘은 여기까지 하고

내일은 작업할거는

- 피통 ui 구현

- 채팅창 구현

- 왼쪽 상단 타이머 구현

 

을 해보고

시간이 남는다면, 

피가 0이되면 움직임이 멈추고, 리트 창이 나오도록 해봐야겠다.

 

오늘도 술 먹으려는데 어제 먹다 남은 고추장찌개를 먹을까

아니면 다른걸 시켜먹을까

 

 

https://github.com/cyanindy/Unity/tree/main/3mario/Assets/Script

 

GitHub - cyanindy/Unity: game dev

game dev. Contribute to cyanindy/Unity development by creating an account on GitHub.

github.com

현재 제작중인 쿠크세이튼3마리오 프로젝트는 깃허브에 public 으로 업로드 되있습니다.