BoxCast
2023. 2. 21. 20:26ㆍUnity/스크립트 기본
RaycastHit2D hit = Physics2D.BoxCast(transform.position, new Vector2(0.99f, 0.1f), 0f, Vector2.down, 0.5f, groundLayer);
void OnDrawGizmos()
{
Gizmos.color=Color.red;
Gizmos.DrawCube(transform.position-transform.up * 0.5f, new Vector2(0.99f, 0.1f));
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
Rigidbody2D rigid;
SpriteRenderer sprite;
Animator anim;
//BoxCollider2D collider;
//AudioSource audio;
private Vector2 inputVec;
bool jumpDown = false;
public LayerMask groundLayer; // 바닥 레이어 !!! 꼭 창에서 설정해주기
public bool isGrounded; // 바닥에 붙어 있는지 여부
Vector2 boxsize = new Vector2(0.7f, 0.2f); // boxcast 크기
float maxDistance = 0.5f; // boxcast 거리
private bool isDoubleJump = false; // 2단 점프
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
sprite = GetComponent<SpriteRenderer>();
anim = GetComponent<Animator>();
//collider = GetComponent<BoxCollider2D>();
//audio = GetComponent<AudioSource>();
}
void Start()
{
Application.targetFrameRate = 60;
}
// Update is called once per frame
void Update()
{
inputVec.x = Input.GetAxisRaw("Horizontal"); // 캐릭터 수직 이동
inputVec.y = Input.GetAxisRaw("Vertical"); // 캐릭터 수평 이동
jumpDown = Input.GetButtonDown("Jump");
Move();
Jump();
}
void LateUpdate()
{
if(inputVec.x != 0){
sprite.flipX = inputVec.x < 0;
}
}
void FixedUpdate()
{
CheckIsGround();
}
void Move()
{
// 방향키 안누를 경우
if( inputVec.x == 0){
// 속도가 0.2보다 느린경우 속도 0으로
if(rigid.velocity.x <= 0.2 && rigid.velocity.x >= -0.2f)
rigid.velocity = new Vector2(0, rigid.velocity.y);
// 지면에서 진행방향 반대로 가속
if(rigid.velocity.x > 0.2f && isGrounded)
rigid.AddForce(Vector2.left * 0.2f, ForceMode2D.Impulse);
if(rigid.velocity.x < -0.2f && isGrounded)
rigid.AddForce(Vector2.right * 0.2f, ForceMode2D.Impulse);
// 공중에서 진행방향 반대로 가속
if(rigid.velocity.x > 0.2f && !isGrounded)
rigid.AddForce(Vector2.left * 0.2f * 0.5f, ForceMode2D.Impulse);
if(rigid.velocity.x < -0.2f && !isGrounded)
rigid.AddForce(Vector2.right * 0.2f * 0.5f, ForceMode2D.Impulse);
return;
}
// 방향키 누를 경우
// 6 이상의 속도로 가속 불가
if( ( rigid.velocity.x > 6 && inputVec.x > 0 ) || ( rigid.velocity.x < -6 && inputVec.x < 0 ) )
return;
// 진행 방향으로 가속
if(rigid.velocity.x > 0 && inputVec.x > 0 || rigid.velocity.x < 0 && inputVec.x < 0)
rigid.AddForce(Vector2.right * inputVec.x * 0.2f, ForceMode2D.Impulse);
// 진행 반대방향으로 가속할경우 2배로 가속
else
rigid.AddForce(Vector2.right * inputVec.x * 0.2f * 2, ForceMode2D.Impulse);
//anim.SetFloat("Speed", Mathf.Abs(rigid.velocity.x));
}
void Jump()
{
if(!jumpDown)
return;
if(isGrounded)
rigid.AddForce(Vector2.up * 11, ForceMode2D.Impulse);
else if(!isGrounded && isDoubleJump == false)
{
isDoubleJump = true;
rigid.velocity = new Vector2(rigid.velocity.x, 0);
rigid.AddForce(Vector2.up * 11, ForceMode2D.Impulse);
}
}
void CheckIsGround()
{
// 아래 방향으로 박스 캐스트
RaycastHit2D hit = Physics2D.BoxCast(transform.position, boxsize, 0f, -transform.up, maxDistance, groundLayer);
// 바닥에 닿았는지 검사
if(hit.collider != null)
{
isDoubleJump = false;
isGrounded = true;
// 발판에 닿을경우 발판을 부모로
if(transform.parent != hit.collider.transform)
transform.SetParent(hit.collider.transform);
}
else
{
isGrounded = false;
// 발판에서 떨어질 경우 부모 해지
if(transform.parent != null)
transform.SetParent(null);
}
}
void OnDrawGizmos()
{
Gizmos.color = new Color(255,0,0,0.5f);
Gizmos.DrawCube(transform.position-transform.up * maxDistance, boxsize);
}
}
728x90