简单起见,突出脚本的内容,我们就只创建一个圆形用来当做当前的敌人角色。
为分清左右,我们再为敌人角色添加一个眼睛,新建一个圆形精灵,更改其颜色为黑色,然后使其成为Enemy的子物体,调整位置,刚刚好放在它的右边,当做眼睛。
然后关键的一个东西,新建一个GroundCheck子物体,空物体即可。后续我们要用其定位,来检测地面。这个名字最好使用GroundCheck,如果你使用了其他名字,在后续的脚本中是需要更改脚本内容的。
接下来,我们为敌人角色添加必要的组件,分别是刚体和碰撞体。
新建一个敌人脚本,命名为Enemy,然后挂载到敌人的身上。
首先声明几个公共字段,用于存储检测点,也就是我们之前创建的GroundCheck子物体。
同时我们还要声明一个层,用于表示地面的层。
再声明一个变量,用于表示前方是否是地面。
private bool isGrounded = false;
private Transform groundCheck;
private LayerMask groundLayer;
然后再Awake方法中获取地面检测点,并且为层赋值,接下来要去编辑器中,创建一个新的层,名叫Ground的层。然后为所有的地面切换为Ground层。
private void Awake()
{
groundCheck = transform.Find("GroundCheck");
groundLayer = LayerMask.GetMask("Ground");
}
接下来,我们检测敌人前方是否是地面。
我们可以使用Physics2D.OverlapCircle方法来进行检测。
该方法需要传入三个参数:
调用Physics2D.OverlapCircle方法后,它会返回一个Collider2D对象,用于表示与检测圆有重叠的物体。如果返回的对象不为空,说明前面有路,继续前进;如果返回的对象为空,说明前面没路了,得往回走。
当然这只是我们所使用的重载的参数啦,该方法还有很多其他重载。
将返回值赋值给isGrounded变量,然后根据其值来判断敌人的当前状态,是否往回走。
需要注意的是,这里使用了2D物理引擎来进行地面检测,所以需要确保地面对象上有相应的Collider2D组件,并设置了正确的层,即Ground层。
实现代码如下:
private void FixedUpdate()
{
// 检测是否在地面上
isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, groundLayer);
}
using UnityEngine;
public class Enemy: MonoBehaviour
{
public float moveSpeed = 3f;
public bool isFacingRight = true;
private Rigidbody2D rb;
private Transform groundCheck;
private bool isGrounded = false;
private float groundCheckRadius = 0.2f;
private LayerMask groundLayer;
private bool isMovingRight = true;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
groundCheck = transform.Find("GroundCheck");
groundLayer = LayerMask.GetMask("Ground");
}
private void FixedUpdate()
{
// 检测是否在地面上
isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, groundLayer);
if (!isGrounded)
{
// 当前没有地面,往回走
Flip();
}
// 左右移动
if (isMovingRight)
{
rb.velocity = new Vector2(moveSpeed, rb.velocity.y);
}
else
{
rb.velocity = new Vector2(-moveSpeed, rb.velocity.y);
}
}
private void Flip()
{
// 改变面朝方向
isFacingRight = !isFacingRight;
Vector3 newScale = transform.localScale;
newScale.x = -newScale.x;
transform.localScale = newScale;
// 改变移动方向
isMovingRight = !isMovingRight;
}
}
运行程序,可以发现敌人角色会按照左右移动,并且遇到没有地面的地方会往回走。
Unity创建一个可移动的2D角色
Unity如何使用手机进行调试(真机)