공부하기싫어
article thumbnail

3월24일 오전2시 포스팅 시작

 

어제한거마무리

일단 어제 만든 폭탄 프리팹을 마무리 했다.

이제 저 rangebox 를 투명처리만 하면 완전 끝

 

오늘은 초록이 프리팹을 만들고

제한 범위 내에서 랜덤하게 좌우로 돌아다니게 하고,

만약 캐릭터가 범위 안에 들어오게 되면

캐릭터를 향해 움직이며

hit 범위 안에 들어오면, attack 애니메이션을 재생하도록 해보자

 

  • 초록이

여친이 그려준 초록이

리지드바디랑 콜라이더를 설정해주고

 

사거리와 히트범위

플레이어를 탐지할 범위와 공격 범위를 만들어 주고

 

애니메이션 세팅

해주고

 

플레이어의 위치와 비교해서 애니메이션을 재생시키고 싶었는데

다른 스크립트의 변수 접근하는걸 좀 찾았다

https://blog.naver.com/PostView.nhn?blogId=jaejae1988&logNo=221246173357&categoryNo=45&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView 

 

[유니티] 다른 오브젝트 스크립트의 변수나 메소드 호출

public class Test01 : MonoBehaviour {  public float testNum = 0; }  이런 클래스가 존재한다고 할 때...

blog.naver.com

이분 블로그를 보고 다른 스크립트의 변수에 접근 하는 법을 배웠다

 

목표를 포착!

시야범위 안에 들어오면 플레이어의 방향으로 공격을 하게끔 설정했다

 

애니메이션이 끊임없이 재생되는데, 이제 공격에 쿨타임을 줘보자

 

애니메이션 파라미터와 쿨타임간 조정하는데만 또 1시간 걸렸다 ㅋㅋ

 

hit 판별

해서 초록이가 때릴때 플레이어가 박스 안에 있다면 데미지를 주게 했고

 

잘된다

잘 되는것까지 확인했고

 

이제 저 범위 안에 들어오면 플레이어의 방향으로 direction 을 고정하고

 

플레이어가 q keydown 했을때 범위 안에 있다면 죽도록 해보자

 

 

오늘 작업 끝!

 

greeny 코드

public class greeny : MonoBehaviour
{
    public float speed=10.0f;
    public bool horizontal=true;
    public float changeTime = 5.0f;
    Rigidbody2D rigidbody2D;
    float timer;
    int direction = 1;
    private bool isAttacking=false;

    Animator animator;

    float atk_cooltime=3.0f;
    float atk_timer=1.0f;

    bool dir_for_player=false;
    float time_keepdir=5.0f;

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

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

    // Update is called once per frame
    void Update()
    {
        Vector2 position = rigidbody2D.position;
        player call = GameObject.Find("WALK_R_Clown_1").GetComponent<player>();
        Vector2 player_pos = call.player_pos;

        timer -= Time.deltaTime;
        if (dir_for_player) {
            if (player_pos.x - position.x <=0) {
                direction = -1;
                animator.SetBool("isLeft", true);
                time_keepdir-=Time.deltaTime;
                if (time_keepdir<=0) {
                    dir_for_player=false;
                }
            } else {
                direction = 1;
                animator.SetBool("isLeft", false);
                time_keepdir-=Time.deltaTime;
                if (time_keepdir<=0) {
                    dir_for_player=false;
                }
            }
        } else {
            if (timer < 0)
            {
                direction = -direction;
                timer = changeTime;
                if (direction>0) {
                    animator.SetBool("isLeft", false);
                } else {
                    animator.SetBool("isLeft", true);
                }
            }
        }

        if (!isAttacking)
        {
            position.x = position.x + Time.deltaTime * speed * direction;
        }

        Collider2D[] sight_collider2Ds = Physics2D.OverlapBoxAll(sight_pos.position, sight_boxSize, 0);
        foreach (Collider2D collider in sight_collider2Ds) {
            if (collider.tag == "Player") {
                //Debug.Log("player is within greenys sight");
                dir_for_player=true;
                if (atk_timer<=0) {
                    Debug.Log("atk_timer <= 0");
                    if (player_pos.x > position.x) {
                        animator.SetBool("right_atk",true);
                        isAttacking=true;
                        animator.SetBool("isAttacking", true);
                        atk_timer=atk_cooltime;
                    } else {
                        animator.SetBool("left_atk",true);
                        isAttacking=true;
                        animator.SetBool("isAttacking", true);
                        atk_timer=atk_cooltime;
                    }
                } else {
                    //Debug.Log("atk_timer-=time.deltatime");
                    atk_timer=atk_timer-Time.deltaTime;
                    animator.SetBool("right_atk",false);
                    animator.SetBool("left_atk",false);
                }
            }
        }
       
        rigidbody2D.MovePosition(position);
    }

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

    private void atk_end() {
        isAttacking=false;
        animator.SetBool("isAttacking", false);
        Debug.Log("atk_end()");
    }

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

    private void right_atk_hit() {
        Collider2D[] collider2Ds = Physics2D.OverlapBoxAll(sight_pos.position, sight_boxSize, 0);
        foreach (Collider2D collider in collider2Ds) {
            if (collider.tag == "Player") {
                collider.GetComponent<player>().ChangeHealth(-1);
            }
        }
    }

    public void hit(string greeny_name) {
        greeny_obj=GameObject.Find(greeny_name);
        Destroy(greeny_obj);
    }
}

 

 

 

플레이어의 q keydown 도 수정했다

if (Input.GetKeyDown(KeyCode.Q)) { //q키 상호작용
            animator.SetBool("attacking",true);
            RaycastHit2D obj_hit = Physics2D.Raycast(rigidbody2d.position + Vector2.up * 0.2f, lookDirection, 2.0f, LayerMask.GetMask("react_q_obj"));
            string obj_N=obj_hit.collider.gameObject.name;

            string obj_tag = obj_hit.collider.tag;
            if (obj_tag == "balls" ) {
                if (obj_hit.collider != null) {
                    Debug.Log("keydown Q : " + obj_hit.collider.gameObject);
                    balls judge_ball = obj_hit.collider.GetComponent<balls>();
                    if (judge_ball != null)
                    {
                        if (judge_ball.hit(obj_N)) {
                            curse_count = curse_count - 1;
                            Debug.Log("left curse_count : " + curse_count);
                        } else {
                            ChangeHealth(-1);
                        }
                    } else { ;}
                }
            }
            else if (obj_tag == "greeny") {
                if (obj_hit.collider != null) {
                    Debug.Log("keydown Q : " + obj_hit.collider.gameObject);
                    greeny judge_greeny = obj_hit.collider.GetComponent<greeny>();
                    judge_greeny.hit(obj_N);
                }
            }
            else if (obj_tag == "McD") {
                if (obj_hit.collider != null) {
                    Debug.Log("keydown Q : " + obj_hit.collider.gameObject);
                    McD judge_mcd = obj_hit.collider.GetComponent<McD>();
                    judge_mcd.hit(1);
                }
            }
            else {;}
        } else {
            animator.SetBool("attacking", false);
        }

 

 

이전 방식으로는 레이캐스트를 하나만 받아올 수 있는것 같아서

q keydown 에 반응하는 오브젝트들의 레이어를 통일하고

tag로 반응을 구분했다

 

맥도날드도 2번 공격하면 죽도록 구현해봤다.

 

오늘은 여기까지 하고 내일은

오늘 제작한 초록이들을 숫자에 맞게 맵에 모두 배치하고,

w 점프 길이에 맞게 바닥 길이를 수정하고,

미사일 프리팹을 구현해볼 예정이다

 

아 맞다 그리고 지금 bounceball 이 바닥에 내려 찍을때 데미지가 들어가는게 아니라

설정된 리지드바디에 스쳐도 데미지가 들어오도록 되어있는데

이부분도 손봐야할 것 같다

 

오늘은 끝! 술사러가야지!

 

 

 

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 으로 업로드 되있습니다.