BoxCast

2023. 2. 21. 20:26Unity/스크립트 기본

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

'Unity > 스크립트 기본' 카테고리의 다른 글

유니티 매니저  (0) 2024.04.05
오브젝트 풀링  (0) 2023.01.26
메모리 관리  (0) 2022.06.27
애니메이터  (0) 2022.06.16
파일 불러오기  (0) 2022.06.16