케릭터에 2단 점프가 안되서 2일을 헤맸다.
여기저기 질문글을 남기고 구글을 찾아헤메다가
어??
왜 되지?
라는 의문과 함께 벽타기도 하면서 2단점프만 가능하게 구현했다.
포네그리프를 해석하는 기분이 이런걸까.
이제 피격 애니메이션과 공격하는 적 제작 시작이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
[SerializeField] GameObject m_slideDust;
private int m_facingDirection = 1;
public float jumpSpeed = 5f;
Rigidbody2D rigid;
Animator anim;
public Transform groundChkFront; // 바닥 체크 position
public Transform groundChkBack; // 바닥 체크 position
public Transform wallChk;
public float wallchkDistance;
public LayerMask w_layer;
bool isWall;
public float slidingSpeed;
public float wallJumpPower;
public bool isWallJump;
public float runSpeed; // 이동 속도
float isRight = 1; // 바라보는 방향 1 = 오른쪽 , -1 = 왼쪽
float input_x;
bool isGround;
public float chkDistance;
public float jumpPower = 1;
public LayerMask g_Layer;
public Transform pos; //케릭앞 칼질히트포인트 설정
public Vector2 boxSize;
[SerializeField]
Transform posion;
[SerializeField]
float checkRadius;
[SerializeField]
LayerMask islayer;
public int jumpCount;
int jumpCnt;
private float curTime;
public float coolTime =0.5f;
private void OnCollisionEnter(Collision col)
{
if (col.gameObject.tag == "Platforms")
{
jumpCount = 2;
}
}
void Start()
{
rigid = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
jumpCnt = jumpCount;
}
void Update()
{
// 캐릭터 점프
isGround = Physics2D.OverlapCircle(posion.position, checkRadius,islayer);
if (isGround == true && Input.GetKeyDown(KeyCode.Space) && jumpCnt > 0 )
{
rigid.velocity = Vector2.up * jumpPower;
}
if (isGround == false && Input.GetKeyDown(KeyCode.Space) && jumpCnt > 0 )
{
rigid.velocity = Vector2.up * jumpPower;
}
if (Input.GetKeyUp(KeyCode.Space)){
jumpCnt--;
}
if (isGround)
{
jumpCnt = jumpCount;
}
input_x = Input.GetAxis("Horizontal");
// 캐릭터의 앞쪽과 뒤쪽의 바닥 체크를 진행
bool ground_front = Physics2D.Raycast(groundChkFront.position, Vector2.down, chkDistance, g_Layer);
bool ground_back = Physics2D.Raycast(groundChkBack.position, Vector2.down, chkDistance, g_Layer);
// 점프 상태에서 앞 또는 뒤쪽에 바닥이 감지되면 바닥에 붙어서 이동하게 변경
if (!isGround && (ground_front || ground_back))
rigid.velocity = new Vector2(rigid.velocity.x, 0);
// 앞 또는 뒤쪽의 바닥이 감지되면 isGround 변수를 참으로!
if (ground_front || ground_back)
isGround = true;
else
isGround = false;
anim.SetBool("isGround", isGround);
isWall = Physics2D.Raycast(wallChk.position,Vector2.right* isRight,wallchkDistance,w_layer);
anim.SetBool("isSliding",isWall);
// 스페이스바가 눌리면 점프 애니메이션을 동작
if (Input.GetButtonDown("Jump"))
{
anim.SetTrigger("Jump");
}
// 방향키가 눌리는 방향과 캐릭터가 바라보는 방향이 다르다면 캐릭터의 방향을 전환.
if(!isWallJump)
if ((input_x > 0 && isRight < 0) || (input_x < 0 && isRight > 0))
{
FlipPlayer();
anim.SetBool("run", true);
}
else if (input_x == 0)
{
anim.SetBool("run", false);
}
//공격 마우스버튼
if(curTime <=0)
{
if (Input.GetMouseButton(0) &&
!anim.GetCurrentAnimatorStateInfo(0).IsName("Attack"))
{ curTime = coolTime;
anim.SetTrigger("Attack");
Collider2D[] collider2Ds = Physics2D.OverlapBoxAll ( pos.position , boxSize ,0);
foreach (Collider2D collider in collider2Ds)
{
if(collider.tag == "Enemy")
{ collider.GetComponent<Enemy>() .TakeDamage(1); }
}
}
}
else
{curTime -= Time.deltaTime;}
}
// Animation Events
// Called in slide animation.
void AE_SlideDust ()
{
Vector3 spawnPosition;
if (m_facingDirection == 1)
spawnPosition = groundChkBack.transform.position;
else
spawnPosition = groundChkFront.transform.position;
if (m_slideDust != null)
{
// Set correct arrow spawn position
GameObject dust = Instantiate(m_slideDust, spawnPosition, gameObject.transform.localRotation) as GameObject;
// Turn arrow in correct direction
dust.transform.localScale = new Vector3(m_facingDirection, 6, 1);
}
}
private void FixedUpdate()
{
// 캐릭터 이동
if(!isWallJump)
rigid.velocity = (new Vector2((input_x) * runSpeed , rigid.velocity.y));
if (isWall)
{
isWallJump = false;
rigid.velocity = new Vector2(rigid.velocity.x,rigid.velocity.y * slidingSpeed);
if(Input.GetAxis("Jump")!=0)
{isWallJump =true;
Invoke("FreezeX", 0.3f);
rigid.velocity = new Vector2( -isRight * wallJumpPower, 0.9f * wallJumpPower);
FlipPlayer();
}
}
}
void FreezeX()
{ isWallJump = false;}
void FlipPlayer()
{
// 방향을 전환.
transform.eulerAngles = new Vector3(0, Mathf.Abs(transform.eulerAngles.y - 180), 0);
isRight = isRight * -1;
}
// 바닥 체크 Ray를 씬화면에 표시
private void OnDrawGizmos()
{
Gizmos.color = Color.red;
Gizmos.DrawRay(groundChkFront.position, Vector2.down * chkDistance);
Gizmos.DrawRay(groundChkBack.position, Vector2.down * chkDistance);
Gizmos.color = Color.blue;
Gizmos.DrawRay(wallChk.position,Vector2.right * isRight * wallchkDistance);
Gizmos.color =Color.blue;
Gizmos.DrawWireCube (pos.position, boxSize);
}
}
|
'유니티 일지' 카테고리의 다른 글
2022.11.17 게임 스테이지 제작중... (0) | 2022.11.17 |
---|---|
#5일차 유니티 공부 (0) | 2022.11.08 |
#4. 유니티 일지 (0) | 2022.11.02 |
유니티 2일차 (0) | 2022.10.31 |
유니티 공부 시작 (0) | 2022.10.30 |