一.写脚本pysicscheck拖拽添加到人物身上
二.检测内容
1.是否在地面,如果在,跳跃,不在则不允许跳跃
对应人物存在组件capsule collider,在人物接触到地面后会产生碰撞(包括碰撞地面和墙面,此时跳跃检测的是地面)
Physics2D.OverlapCircle
Declaration
public static Collider2D OverlapCircle(Vector2 point, float radius, int layerMask = DefaultRaycastLayers, float minDepth = -Mathf.Infinity, float maxDepth = Mathf.Infinity);
layerMask: Filter to check objects only on specific layers.
圆是由其在世界空间中的中心坐标和半径定义的。可选的 layerMask 允许测试只检查特定层上的对象
1)查看人物中心点位置,由于人物的pivot点设置在脚底,刚好就是在对是否接触地面时候的检测位置,故函数中point是transform.position
2)对于半径,通过设置public变量在编辑器中调整检测范围
3)对于结构体layermask需要添加我们需要的检测图层
pysicscheck脚本内容如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PysicsCheck : MonoBehaviour
{
public bool isGround;
public float checkRadius;
public LayerMask groundLayer;
//持续不断的进行物理检测
private void Update()
{
Check();
}
public void Check()
{
isGround=Physics2D.OverlapCircle(transform.position,checkRadius,groundLayer);
}
}
①可以看到添加过public实例后的layermask下拉框内容如下,没有需求的层(地面层,platdorm)
③设置给人需要检测的碰撞层
设置好检测半径0.几就可以测试,落地上就true,不落 F,从而通过访问是否落地来限制跳跃次数。
4)在playercontroller中添加代码完成人物跳跃的限制
组件,代码之间的互相访问:
①创建组件对应的类型的变量
②通过getcomponent获得组件
private PysicsCheck physicsCheck;
physicsCheck = GetComponent<PysicsCheck>();
如此就可以获取到在物理检测脚本中创建的所有公开变量
完成判定
private void Jump(InputAction.CallbackContext obj)
{
if (physicsCheck.isGround)
{
rb.AddForce(transform.up * JumpForce, ForceMode2D.Impulse);
}
}
绘制较低碰撞范围的检测可以用OnDrawGizemosSelectsed()在dizemos中绘制一个小范围加入到检测锚点的周围减小半径检测带来的偏差。
2.敌人也需要检测周围的物理环境包括
2.为人物碰撞添加该材质,就不会猛撞到墙上粘住