공부하기싫어
article thumbnail

3.19 오후 5시 시작

 

일단 점프를 구현해야 하는데

 

처음에는 반원으로 이동하는 법을 고민하다가

굳이 반원 말고 삼각형의 빗변을 따라 이동하는 식으로 구현하면 어떨까 생각해봤음

대충 이런식으로?

 

즉 반지름x2 만큼의 거리를 점프로 이동하게 되겠고

높이는 미사일이나 폭탄과의 상호작용을 생각해서 나중에 또 설정해야겠다

 

Vector3.MoveTowords 를 써봐야겠다

https://ssabi.tistory.com/23

 

[Unity3D] 트랜스폼(Transform) 이동(Move)

유니티 좌표계 프로그램마다 사용하는 좌표계가 다릅니다. 따라서 좌표계에 대해서 이해하는 것은 매우 중요합니다. 유니티에서는 위치를 표현할 때 왼손 좌표계를 이용합니다. X축은 빨간색, Y

ssabi.tistory.com

 

일단 기존의 update함수 안의 코드가 너무 번잡하게 되어있어서

g키를 입력받는 포탈 이용 시

g키를 한번 눌러서 바로 반응이 안되고 여러번 눌러야 이동이 되는데

이를 위해 update함수 내 이동관련 코드들을

따로따로 함수로 정의해서

함수만 가져다 쓰고, 이를 인자로 컨트롤 하는 방법을 생각해봐서 코드를 수정해 봤다.

 

기존코드

void Update() {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        bool keydown_w = Input.GetKeyDown(KeyCode.W);
        float Speed=player_Speed;
        Vector3 potal_coordinate;

        Vector2 move = new Vector2(horizontal, vertical);
        if(!Mathf.Approximately(move.x, 0.0f) || !Mathf.Approximately(move.y, 0.0f))
        {
            lookDirection.Set(move.x, move.y);
            lookDirection.Normalize();
        }//lookDirection 을 위한 vector 랑 normalize


        if (horizontal==0) {
            animator.SetBool("isMoving", false);
        }
        else if(horizontal < 0) {
            animator.SetInteger ("direction", -1);
            animator.SetBool("isMoving", true);
        }
        else if (horizontal > 0 ) {
            animator.SetInteger ("direction", 1);
            animator.SetBool("isMoving", true);
        }

        if (Input.GetKeyDown(KeyCode.Q)) { //q키 상호작용
            attack();
            RaycastHit2D ball_hit = Physics2D.Raycast(rigidbody2d.position + Vector2.up * 0.2f, lookDirection, 2.0f, LayerMask.GetMask("balls"));
            string ballN=ball_hit.collider.gameObject.name;
            if (ball_hit.collider != null) {
                Debug.Log("keydown Q : " + ball_hit.collider.gameObject);
                balls character = ball_hit.collider.GetComponent<balls>();
                if (character != null)
                {
                    curse_count = curse_count - character.hit(ballN);
                    Debug.Log("left curse_count : " + curse_count);
                }
            }

        } else {
            animator.SetBool("attacking", false);
        }


        Vector2 position = rigidbody2d.position; //현재위치 백터

        if (Input.GetKeyDown(KeyCode.G)) //g키 상호작용
        {
            RaycastHit2D potal_hit = Physics2D.Raycast(rigidbody2d.position + Vector2.up * 0.2f, lookDirection, 1.0f, LayerMask.GetMask("potal"));
            string pointN= potal_hit.collider.gameObject.name;
            if (potal_hit.collider != null)
            {
                Debug.Log("keydown G : " + potal_hit.collider.gameObject);
                PointandPotal character = potal_hit.collider.GetComponent<PointandPotal>();
                if (character != null)
                {
                    potal_coordinate=character.updown(pointN);
                    rigidbody2d.MovePosition(potal_coordinate);
                }
            }
        } else {
            if(!isAttacking) { //이동이 이루어지는 곳
                position.x = position.x + (Speed * horizontal * Time.deltaTime);
                rigidbody2d.MovePosition(position);
            } else {
                rigidbody2d.MovePosition(position);
            }
        }
    }

 

이게 내가 블로그 작성에서는 코드 안에 색깔로 구분가기 쉽게 되어있는데

포스팅하고나서 완료된 글을 보면 다 흰색글씨로만 되어있는데 왜이런거임.. html로 붙여넣을까 가독성이 너무 떨어지네

 

 

  • g키

진짜 아무리 해봐도 한번 눌러서 이동이 안되는거임

계속 멈춰있고 getkey 로 바꾸고 해봐도 이동이 잘 안됨

그렇게 지금 한 5시간째 하고있는데 유튜브를 하나 발견함

 

https://www.youtube.com/watch?v=_LZz5BaWoVY 

 

즉, player 스크립트에서 좌표를 이동시키는게 아니라

portal 에서 제어할 수 있도록 하는거다

 

이 영상에서 코루틴이란걸 사용하는데

https://docs.unity3d.com/kr/530/Manual/Coroutines.html

 

유니티 - 매뉴얼: 코루틴(Coroutine)

게임 오브젝트 생성 및 삭제 특수 폴더와 스크립트 컴파일 순서 코루틴(Coroutine) 함수를 호출하면 반환값을 반환하기 전에 실행 완료됩니다. 즉, 함수에서 수행되는 작업은 하나의 프레임에서 수

docs.unity3d.com

이런게 있는지 몰랐으니 구현할 수가 있나...

 

일단 대충 되게는 해놨다

 

이게 렉인지 아닌지 모르겠는데

g 키를 누르면 얘가 input 을 못받는다

 

아니 걍 뭐랄까 걍 논리적으로 조건은 맞는데 유니티에서 실행을 안해준다.

 

 private void OnTriggerStay2D(Collider2D collision) {
        if(collision.CompareTag("Player") && Input.GetKeyDown(KeyCode.G)) {
            StartCoroutine( TeleportRoutine() );
            Debug.Log("keydown");
        }
    }

 

이고 나는 트리거 안에 머물러있을때  g키를 아무리 눌러봐도 로그가 안나온다

 

지금 보면

지금 보면 getkeydown 으로 키를 입력받았을때

 

void Update()
    {
        if (Input.GetKeyDown(KeyCode.G)) {
            Debug.Log("in update key down log");
        }
       
    }

    private void OnTriggerEnter2D(Collider2D collision) {
        if(collision.CompareTag("Player")) {
            departure_obj = collision.gameObject;
        }
    }

    private void OnTriggerStay2D(Collider2D collision) {
        if(collision.CompareTag("Player") && Input.GetKeyDown(KeyCode.G)) {
            StartCoroutine( TeleportRoutine() );
            Debug.Log("keydown");
        }
    }

 

이런식으로 해서

그냥 g키를 눌렀을때 반응을 하는지 알아보려고 update 안에다가 저렇게 써봤는데

한번 g키를 눌렀을때 로그가 11개가 쭉 올라왔다.

 

이게 맞아?

keydown은 눌렀을때 1회만 되야 하는거 아님?

세팅이 잘못된건가?

 

후 일단 포탈은 잘 되게 바꿨다.

getkey 로 해서 어찌저찌 잘 되는데 이제 w가 문제임

 

 

 

if (Input.GetKeyDown(KeyCode.W)) {
            w_last_position.x=position.x+jump_weith; w_last_position.y=position.y;
            w_middle_position.x=position.x+(jump_weith/2); w_middle_position.y=position.y+jump_height;
            w_sw=true;
            w_para=1;
        }

        if(w_para==1) {
            transform.position=Vector2.MoveTowards(position,w_middle_position,Speed);
            if (position.y==w_middle_position.y) {w_para=-1;}
        } else if (w_para==-1) {
            transform.position=Vector2.MoveTowards(position,w_last_position,Speed);
            if (position==w_last_position) {w_para=0; w_sw=false;}
        }
           
        if(!q_sw && !w_sw && !g_sw) { //이동이 이루어지는 곳
            position.x = position.x + (Speed * horizontal * Time.deltaTime);
        }
   
        if(w_para==0) {rigidbody2d.MovePosition(position);}

이런식으로 코드를 짜봤는데

 

지금 쓰다가 생각난건데 스피드에 타임 델타 곱하면

움직이는걸 꽤 볼 수 있겠다라는 생각임

 

 

 

ㅋㅋ 근데 이제 뒤로 점프를 안함 ㅋㅋ

점프 속도도 너무 빠르고

 

내일은 이걸 좀 조져야하는데

내일은 본가가서 잘 모르겠긴함

 

오늘은 일단 여기까지

 

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