Unity2D_Basic#6


210725
Unity2D_Basic#6
  • タブレットプレイヤー移動、ジャンプ
  • を実現
    -移動
    プレーヤーオブジェクトの作成とコードの作成
    1.PlayerController.cs
    プレイヤーを動かすためにキーを入力すると移動します.
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PlayerController : MonoBehaviour
    {
        private Movement2D movement2D;
    
        private void Awake()
        {
            movement2D = GetComponent<Movement2D>();
        }
    
        private void Update()
        {
            float x = Input.GetAxisRaw("Horizontal");   // 좌우 입력
            movement2D.Move(x); // 이동 방향 제어
        }
    }
    2.Movement2D.cs
    Player Controlに入力すると、Move関数を呼び出します->Move関数の移動方向を制御します
    対応する機能を持つコード
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Movement2D : MonoBehaviour
    {
        [SerializeField]
        private float speed = 5.0f;
        private Rigidbody2D rigid2D;
    
        private void Awake()
        {
            rigid2D = GetComponent<Rigidbody2D>();
        }
    
        public void Move(float x)
        {
            // x 축 이동은  x * speed, y 축은 기존의 속력 값
            rigid2D.velocity = new Vector2(x * speed, rigid2D.velocity.y);
        }
    }

    リジッドボディと衝突機の適用により、重力の影響で下に墜落し、他のオブジェクトと衝突して移動することができます.
    +ジャンプ
    Player Control,Movement 2 Dでコードを修正する
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PlayerController : MonoBehaviour
    {
        private Movement2D movement2D;
    
        private void Awake()
        {
            movement2D = GetComponent<Movement2D>();
        }
    
        private void Update()
        {
            float x = Input.GetAxisRaw("Horizontal");   // 좌우 입력
            movement2D.Move(x); // 이동 방향 제어
    
            // 스페이스 키를 누르면 점프
            if (Input.GetKeyDown(KeyCode.Space))
            {
                movement2D.Jump();
            }
            // 스페이스 키를 누르고 있으면 isLongJump = true
            if (Input.GetKey(KeyCode.Space))
            {
                movement2D.isLongJump = true;
            }
            // 스페이스 키를 떼면 false
            if (Input.GetKeyUp(KeyCode.Space))
            {
                movement2D.isLongJump = false;
            }
        }
    }
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Movement2D : MonoBehaviour
    {
        [SerializeField]
        private float speed = 5.0f; // 이동 속도
        [SerializeField]
        private float jumpForce = 8.0f; // 점프 힘 (클수록 높이 점프한다)
        private Rigidbody2D rigid2D;
        [HideInInspector]   // public 타입 변수를 Inspector view에서 보이지 않게 한다.
        public bool isLongJump = false; // 낮은 점프, 높은 점프를 체크
        
        private void Awake()
        {
            rigid2D = GetComponent<Rigidbody2D>();
        }
    
        private void FixedUpdate()
        {
            // 낮은 점프, 높은 점프 구현을 위한 중력 계수 (gravityScale) 조절
    
            if (isLongJump && rigid2D.velocity.y > 0)   //  높은 점프 -> 중력 계수가 낮다
            {
                rigid2D.gravityScale = 1.0f;
            }
            else // 낮은 점프
            {
                rigid2D.gravityScale = 2.5f;
            }
        }
        public void Move(float x)
        {
            // x 축 이동은  x * speed, y 축은 기존의 속력 값
            rigid2D.velocity = new Vector2(x * speed, rigid2D.velocity.y);
        }
    
        public void Jump()
        {
            // fumpForce의 크기만큼 위 방향으로 속력 설정
            rigid2D.velocity = Vector2.up * jumpForce;
        }
    }
    -rigid2D.重力スケールじゅうりょくすけーる:重力係数じゅうりょくけいすう
    プレイヤーに与える重力->(0,-98.1,0)*gravityScale
    gravityScale
    -> 1 : transform.position+=(0,-98.1,0)の演算を追加
    -> 2.5 : transform.position+=(0,-24525,0)の演算を追加

    スペースキーの入力->ジャンプ
    長押しする
    GetKeyやGetKey UPと比べると、
    -今は無限に走ることができますが、地面にぶつかったときだけ走るように修正します.
    Movement2D.cs
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Movement2D : MonoBehaviour
    {
        [SerializeField]
        private float speed = 5.0f; // 이동 속도
        [SerializeField]
        private float jumpForce = 8.0f; // 점프 힘 (클수록 높이 점프한다)
        private Rigidbody2D rigid2D;
        [HideInInspector]   // public 타입 변수를 Inspector view에서 보이지 않게 한다.
        public bool isLongJump = false; // 낮은 점프, 높은 점프를 체크
    
        [SerializeField]
        private LayerMask groundLayer;  // 바닥 체크를 위한 충돌 레이어
        private CapsuleCollider2D capsuleCollider2D; // 오브젝트의 충돌 범위 컴포넌트
        private bool isGrounded;    // 바닥에 닿아있을 때 true이다
        private Vector3 footPosition;   // 발의 위치
    
        private void Awake()
        {
            rigid2D = GetComponent<Rigidbody2D>();
            capsuleCollider2D = GetComponent<CapsuleCollider2D>();
        }
    
        private void FixedUpdate()
        {
            // 플레이어 오브젝트의 Collider2D min, center, max 위치 정보
            Bounds bounds = capsuleCollider2D.bounds;
            // 플레이어 발 위치 설정
            footPosition = new Vector2(bounds.center.x, bounds.min.y);
            // 발 위치에 원 생성, 원이 바닥과 닿아있으면 true
            isGrounded = Physics2D.OverlapCircle(footPosition, 0.1f, groundLayer);
    
            // 낮은 점프, 높은 점프 구현을 위한 중력 계수 (gravityScale) 조절
            if (isLongJump && rigid2D.velocity.y > 0)   //  높은 점프 -> 중력 계수가 낮다
            {
                rigid2D.gravityScale = 1.0f;
            }
            else // 낮은 점프
            {
                rigid2D.gravityScale = 2.5f;
            }
        }
    
        private void OnDrawGizmos()
        {
            Gizmos.color = Color.blue;  // 파란색으로 설정
            Gizmos.DrawSphere(footPosition, 0.1f);  // 발의 위치에 0.1 반지름의 구 생성
        }
        public void Move(float x)
        {
            // x 축 이동은  x * speed, y 축은 기존의 속력 값
            rigid2D.velocity = new Vector2(x * speed, rigid2D.velocity.y);
        }
    
        public void Jump()
        {
            if (isGrounded == true) // 바닥을 밟고 있을때만 점프 가능
            {
                // jumpForce의 크기만큼 위 방향으로 속력 설정
                rigid2D.velocity = Vector2.up * jumpForce;
            }
        }
    }
    -Layerロール(変数タイプLayer Mask)
    オブジェクトの描画順序の設定
    オブジェクトの競合における指定したレイヤとの競合を除外できます.
    レイヤーの追加



    プレイヤーが踏むことができるすべてのオブジェクトに折り返しレイヤを設定します

    プレーヤーオブジェクト用にレイヤーをバックグラウンドレイヤーに設定します.

    -Gizmos
    直線、長方形、円を描画して、画面に表示されない衝突範囲などを所望の位置に配置するかどうかを決定します.
    ->ゲームビューでは見えません.
  • ジャンプ可能回数を増やす
    Movement2D.cs
  • using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Movement2D : MonoBehaviour
    {
        [SerializeField]
        private float speed = 5.0f; // 이동 속도
        [SerializeField]
        private float jumpForce = 8.0f; // 점프 힘 (클수록 높이 점프한다)
        private Rigidbody2D rigid2D;
        [HideInInspector]   // public 타입 변수를 Inspector view에서 보이지 않게 한다.
        public bool isLongJump = false; // 낮은 점프, 높은 점프를 체크
    
        [SerializeField]
        private LayerMask groundLayer;  // 바닥 체크를 위한 충돌 레이어
        private CapsuleCollider2D capsuleCollider2D; // 오브젝트의 충돌 범위 컴포넌트
        private bool isGrounded;    // 바닥에 닿아있을 때 true이다
        private Vector3 footPosition;   // 발의 위치
    
        [SerializeField]
        private int maxJumpCount = 2;   // 땅을 밟기 전까지의 최대 점프 횟수
        private int currentJumpCount = 0;   // 현재 가능한 점프 횟수
        private void Awake()
        {
            rigid2D = GetComponent<Rigidbody2D>();
            capsuleCollider2D = GetComponent<CapsuleCollider2D>();
        }
    
        private void FixedUpdate()
        {
            // 플레이어 오브젝트의 Collider2D min, center, max 위치 정보
            Bounds bounds = capsuleCollider2D.bounds;
            // 플레이어 발 위치 설정
            footPosition = new Vector2(bounds.center.x, bounds.min.y);
            // 발 위치에 원 생성, 원이 바닥과 닿아있으면 true
            isGrounded = Physics2D.OverlapCircle(footPosition, 0.1f, groundLayer);
    
            // 플레이어가 바닥에 닿아있고 y축 속도가 0 이하
            // y축 속도가 0 이하라는 조건을 추가하지 않을 시 점프키를 누르는 순간에도 초기화가 된다
            if (isGrounded == true && rigid2D.velocity.y <= 0)
            {
                currentJumpCount = maxJumpCount;
            }
    
            // 낮은 점프, 높은 점프 구현을 위한 중력 계수 (gravityScale) 조절
            if (isLongJump && rigid2D.velocity.y > 0)   //  높은 점프 -> 중력 계수가 낮다
            {
                rigid2D.gravityScale = 1.0f;
            }
            else // 낮은 점프
            {
                rigid2D.gravityScale = 2.5f;
            }
        }
    
        private void OnDrawGizmos()
        {
            Gizmos.color = Color.blue;  // 파란색으로 설정
            Gizmos.DrawSphere(footPosition, 0.1f);  // 발의 위치에 0.1 반지름의 구 생성
        }
        public void Move(float x)
        {
            // x 축 이동은  x * speed, y 축은 기존의 속력 값
            rigid2D.velocity = new Vector2(x * speed, rigid2D.velocity.y);
        }
    
        public void Jump()
        {
            if (currentJumpCount > 0) // 남은 점프 횟수가 0 보다 클 때
            {
                // jumpForce의 크기만큼 위 방향으로 속력 설정
                rigid2D.velocity = Vector2.up * jumpForce;
                // 점프횟수 1회 감소
                currentJumpCount--;
            }
        }
    }
    private int maxJumpCount = 2; //踏切前最大ジャンプ回数
    private int currentJumpCount = 0; //現在のジャンプ可能回数
    最大ジャンプ回数を増やし、ジャンプ時に1回減らす.
    接地時、y軸速度が0未満であることを条件とする.速度制限を設定しない場合は、ジャンプで初期化し、最大3回です.

    リファレンス
    https://www.inflearn.com/course/%EA%B3%A0%EB%B0%95%EC%82%AC-%EC%9C%A0%EB%8B%88%ED%8B%B0-%EA%B8%B0%EC%B4%88/lecture/48460?tab=note&mm=null