[Unity] Player05-物理环境监测及Gizmos绘制(碰撞)

455 阅读1分钟
  • 1.添加通用碰撞检测类: Assets/Screipt/PhysicsCheck.cs, 并挂载到Player
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PhysicsCheck : MonoBehaviour
{
    public Vector2 bottomOffset; //位移差值
    public bool isGround;
    public float checkRadius;
    public LayerMask groundLayer; // 碰撞的图层。这里正是unity中给平台添加的Ground

    // Update is called once per frame
    void Update()
    {
        Check();
    }

    private void Check()
    {
        // 检测地面
        isGround = Physics2D.OverlapCircle((Vector2)transform.position + bottomOffset, checkRadius, groundLayer);
    }

    private void OnDrawGizmosSelected()
    {
        Gizmos.DrawWireSphere((Vector2)transform.position + bottomOffset, checkRadius);
    }
}
  • 2.给平台图层添加LayerMask,并在c#脚本组件中选择groundLayer为新增的Ground

image.png image.png

  • 3.编写PlayerController实现人物的碰撞
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{

    public PlayerInputControl inputControl;
    private Rigidbody2D rb;
    public Vector2 inputDirection;
    public PhysicsCheck physicsCheck;

    [Header("基本功能")]
    public float speed;
    public float jumpForce;


    private void Awake()
    {
        inputControl = new PlayerInputControl();
        rb = GetComponent<Rigidbody2D>();

        // 跳跃
        inputControl.Gameplay.Jump.started += Jump; // += 是事件注册(类似回调?)

        physicsCheck = GetComponent<PhysicsCheck>(); //碰撞
    }


    private void OnEnable()
    {
        inputControl.Enable();
    }

    private void OnDisable()
    {
        inputControl.Disable();
    }

    private void Update()
    {
        // 这个Gameplay是添加Player Input时创建的,改名的,虽然后面删除了组件
        inputDirection = inputControl.Gameplay.Move.ReadValue<Vector2>();
    }

    private void FixedUpdate()
    {
        Move();
    }

    public void Move()
    {

        // 人物移动
        rb.velocity = new Vector2(inputDirection.x * speed * Time.deltaTime, rb.velocity.y);

        // 人物翻转
        int faceDir = (int)transform.localScale.x; // 面向方向
        if (inputDirection.x > 0)
            faceDir = 1;
        if (inputDirection.x < 0)
            faceDir = -1;
        transform.localScale = new Vector3(faceDir, 1, 1);
    }


    private void Jump(InputAction.CallbackContext context)
    {
        // Debug.Log("JUmp");
        if (physicsCheck.isGround)
        {
            rb.AddForce(transform.up * jumpForce, ForceMode2D.Impulse);
        }
    }
}

位移差值(可视化的碰撞范围) bottomOffset

public Vector2 bottomOffset; //位移差值
 
private void OnDrawGizmosSelected()
{
    Gizmos.DrawWireSphere((Vector2)transform.position + bottomOffset, checkRadius);
}

image.png

让人物不黏在墙上

创建文件夹Assets/Settings/Physics Material

创建2D材质

image.png'v [cai'i [cai'zh材质'i [cai'zh'v [caii' [ca'i [cai'zh材质'i [cai'zh'v [caii'i [cai'zh材质'i [cai'zh'v [caii' [ca'i [cai'zh材质'i [cai'zh'v [caii'zhi] image.png

给人物的碰撞选择材质

image.png