目前开发到Crawler的移动和翻转效果
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using Unity.VisualScripting;
using UnityEngine;
public class Crawler : MonoBehaviour
{
//朝向
private bool isFacingRight;
//死亡施加力
private bool isDead;
private Rigidbody2D rigidBody;
public float movementSpeed;
//地面墙壁检测
private bool isGrounded;//是否将要到悬崖
public GameObject groundCheck;//虫子的一个子物体
public LayerMask ground;//设置为地面
public float circleRadiu;//半径
//面向的物体碰撞检测
public Collider2D facingDetector;//脸上设置碰撞体
public ContactFilter2D contact;//接触筛选器,用于以不同方式筛选结果,例如按层遮罩、Z 深度。注意,法线角度不用于重叠测试。
private void Start()
{
rigidBody = GetComponent<Rigidbody2D>();
}
private void Update()
{
Direction();
Movement();
FacingDetect();
}
/// <summary>
/// 检测朝向
/// </summary>
private void Direction()
{
if(transform.localScale.x == 1)
{
isFacingRight = true;
}
else if(transform.localScale.x == -1)
{
isFacingRight = false;
}
}
/// <summary>
/// 移动
/// </summary>
private void Movement()
{
if (!isDead)
{
if (isFacingRight)
{
rigidBody.velocity = Vector2.right * movementSpeed;
}
else
{
rigidBody.velocity = Vector2.left * movementSpeed;
}
}
}
/// <summary>
/// 面向检测 (有两个可能性一是快到悬崖 二是撞到墙壁)
/// </summary>
private void FacingDetect()
{
if (isDead)
{
return;
}
//是否碰到地面或者墙壁 在一个圆圈内检测是否碰到相应的LayerMask
isGrounded = Physics2D.OverlapCircle(groundCheck.transform.position,circleRadiu,ground);
if(!isGrounded) //检测到快离开地面 回头
{
Filp();
}
else//检测虫子碰到了几个碰撞体 count大于0 就是撞墙了回头
{
int count = Physics2D.OverlapCollider(facingDetector, contact, new List<Collider2D>());
if(count > 0)
{
Filp();
}
}
}
/// <summary>
/// 碰到墙壁后翻转
/// </summary>
private void Filp()
{
Vector2 vector = transform.localScale;
vector.x *= -1;
transform.localScale = vector;
}
}
其中 Physics2D.OverlapCircle 的unity 相关文档https://docs.unity.cn/cn/2022.3/ScriptReference/Physics2D.OverlapCircle.html
和 Physics2D.OverlapCollider 的unity 相关文档
https://docs.unity.cn/cn/2022.3/ScriptReference/Physics2D.OverlapCollider.html
注意设置上的