작성
·
328
0
제가 유니티로 점프랑 애니메이션을 구현하는데 점프는 ground Layer에서만 되도록 Linecast로 플레이어 위치랑 0.1칸 아래 사이에 ground Layer가 있을 때만 점프가 되도록 했는데.. 다른 프로젝트에서는 잘만 되더니 다른 프로젝트로 이 스크립트 파일을 옮기니까 공중에서도 점프가 되고 점프 애니메이션이 계속 재생됩니다.
어떻게 하면 해결될까요.. 코드는 이렇게 작성했습니다. (위쪽은 그냥 글로 썼고 아래쪽은 코드 눌러서 썼으니까 편한거 보시고 답변주십셔)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
Rigidbody2D rbody; //Rigidbody2D형 변수
float axisH = 0.0f; //입력
public float speed = 3.0f; //이동 속도
public float jump = 9.0f; //점프력
public LayerMask groundLayer; //착지할 수 있는 레이어
bool goJump = false; //점프 개시 플래그
bool onGround = false; //지면에 서 있는 플래그
//애니메이션 처리
Animator animator; //애니메이터
public string stopAnime = "PlayerStop";
public string moveAnime = "PlayerMove";
public string jumpAnime = "PlayerJump";
public string goalAnime = "PlayerGoal";
public string deadAnime = "PlayerOver";
string nowAnime = "";
string oldAnime = "";
void Start()
{
//Rigidbody2D 가져오기
rbody = this.GetComponent<Rigidbody2D>();
//Animator 가져오기
animator = GetComponent<Animator>();
nowAnime = stopAnime;
oldAnime = stopAnime;
}
void Update()
{
if (Input.GetButtonDown("Jump"))
{
Jump(); //점프
}
}
//착지 판정
onGround = Physics2D.Linecast(transform.position, transform.position - (transform.up * 0.1f), groundLayer);
if(onGround || axisH != 0)
{
//지면 위 or 속도가 0 아님
//속도 갱신하기
rbody.velocity = new Vector2(axisH * speed, rbody.velocity.y);
}
if (onGround && goJump)
{
//지면 위에서 점프 키 눌림
//점프하기
Debug.Log("점프!");
Vector2 jumpPw = new Vector2(0, jump); //점프를 위한 벡터 생성
rbody.AddForce(jumpPw, ForceMode2D.Impulse); //순간적인 힘 가하기
goJump = false; //점프 플래그 끄기
}
if (onGround)
{
//지면 위
if (axisH == 0)
{
nowAnime = stopAnime; //정지
}
else
{
nowAnime = moveAnime; //이동
}
}
else
{
//공중
nowAnime = jumpAnime;
}
if (nowAnime != oldAnime)
{
oldAnime = nowAnime;
animator.Play(nowAnime); //애니메이션 재생
}
}
//점프
public void Jump()
{
goJump = true; //점프 플래그 켜기
Debug.Log("점프 버튼 눌림!");
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
Rigidbody2D rbody; //Rigidbody2D형 변수
float axisH = 0.0f; //입력
public float speed = 3.0f; //이동 속도
public float jump = 9.0f; //점프력
public LayerMask groundLayer; //착지할 수 있는 레이어
bool goJump = false; //점프 개시 플래그
bool onGround = false; //지면에 서 있는 플래그
//애니메이션 처리
Animator animator; //애니메이터
public string stopAnime = "PlayerStop";
public string moveAnime = "PlayerMove";
public string jumpAnime = "PlayerJump";
public string goalAnime = "PlayerGoal";
public string deadAnime = "PlayerOver";
string nowAnime = "";
string oldAnime = "";
void Start()
{
//Rigidbody2D 가져오기
rbody = this.GetComponent<Rigidbody2D>();
//Animator 가져오기
animator = GetComponent<Animator>();
nowAnime = stopAnime;
oldAnime = stopAnime;
}
void Update()
{
if (Input.GetButtonDown("Jump"))
{
Jump(); //점프
}
}
//착지 판정
onGround = Physics2D.Linecast(transform.position, transform.position - (transform.up * 0.1f), groundLayer);
if(onGround || axisH != 0)
{
//지면 위 or 속도가 0 아님
//속도 갱신하기
rbody.velocity = new Vector2(axisH * speed, rbody.velocity.y);
}
if (onGround && goJump)
{
//지면 위에서 점프 키 눌림
//점프하기
Debug.Log("점프!");
Vector2 jumpPw = new Vector2(0, jump); //점프를 위한 벡터 생성
rbody.AddForce(jumpPw, ForceMode2D.Impulse); //순간적인 힘 가하기
goJump = false; //점프 플래그 끄기
}
if (onGround)
{
//지면 위
if (axisH == 0)
{
nowAnime = stopAnime; //정지
}
else
{
nowAnime = moveAnime; //이동
}
}
else
{
//공중
nowAnime = jumpAnime;
}
if (nowAnime != oldAnime)
{
oldAnime = nowAnime;
animator.Play(nowAnime); //애니메이션 재생
}
}
//점프
public void Jump()
{
goJump = true; //점프 플래그 켜기
Debug.Log("점프 버튼 눌림!");
}
답변 1
1
안녕하세요, 인프런 AI 인턴이에요. Linecast 오류에 대해 도움을 드릴게요.
코드를 확인해보니, Linecast를 사용하여 플레이어와 지면 사이에 Raycast를 쏴서 점프가 가능한지를 판단하고 있는 것 같아요. 다른 프로젝트에서는 잘 동작하지만 이번 프로젝트로 이동했을 때는 정상적으로 동작하지 않는다는 거죠?
가능한 원인 몇 가지를 제시해 드릴게요.
레이어 설정 확인: groundLayer 변수에 할당한 레이어가 정확한지 확인해주세요. 다른 프로젝트와 동일하게 설정되어 있는지 확인하는 것이 중요해요.
충돌 체크: Linecast 메서드에 충돌 판정을 결과로 반환하는 부분을 추가해보세요. Linecast의 반환 값이 true면 점프를 할 수 없다고 판단하도록 해보세요. 아마도 Linecast에 충돌하는 레이어가 없어서 점프 가능 여부를 판단하지 못하고 있을 수도 있어요.
플레이어의 Layer 설정 확인: 플레이어의 레이어와 Ground Layer의 충돌 설정이 제대로 되어 있는지 확인해주세요. 점프 가능한지 판단하는 Linecast가 올바르게 작동하려면 플레이어와 지면이 충돌로 설정되어 있어야 합니다.
위의 가능한 원인들을 확인하고 수정해보시면 오류가 해결될 수 있을 거예요. 추가적인 도움이 필요하다면 알려주세요!