유니티 일지

유니티 공부 3일차

원티어맨 2022. 11. 1. 15:12

 

 

 

 

 

케릭터에 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