[6주-29일차] 쿠크3마 연습용 웹게임 - q,w,g 입력 시 이동 제한 구현
3.19 오후 5시 시작
일단 점프를 구현해야 하는데
처음에는 반원으로 이동하는 법을 고민하다가
굳이 반원 말고 삼각형의 빗변을 따라 이동하는 식으로 구현하면 어떨까 생각해봤음
즉 반지름x2 만큼의 거리를 점프로 이동하게 되겠고
높이는 미사일이나 폭탄과의 상호작용을 생각해서 나중에 또 설정해야겠다
Vector3.MoveTowords 를 써봐야겠다
[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 을 못받는다
아니 걍 뭐랄까 걍 논리적으로 조건은 맞는데 유니티에서 실행을 안해준다.
이고 나는 트리거 안에 머물러있을때 g키를 아무리 눌러봐도 로그가 안나온다
지금 보면 getkeydown 으로 키를 입력받았을때
이런식으로 해서
그냥 g키를 눌렀을때 반응을 하는지 알아보려고 update 안에다가 저렇게 써봤는데
한번 g키를 눌렀을때 로그가 11개가 쭉 올라왔다.
이게 맞아?
keydown은 눌렀을때 1회만 되야 하는거 아님?
세팅이 잘못된건가?
후 일단 포탈은 잘 되게 바꿨다.
getkey 로 해서 어찌저찌 잘 되는데 이제 w가 문제임
이런식으로 코드를 짜봤는데
지금 쓰다가 생각난건데 스피드에 타임 델타 곱하면
움직이는걸 꽤 볼 수 있겠다라는 생각임
오
ㅋㅋ 근데 이제 뒤로 점프를 안함 ㅋㅋ
점프 속도도 너무 빠르고
내일은 이걸 좀 조져야하는데
내일은 본가가서 잘 모르겠긴함
오늘은 일단 여기까지
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