- 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
- 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);
}
让人物不黏在墙上
创建文件夹Assets/Settings/Physics Material
创建2D材质
'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]
给人物的碰撞选择材质