Unity2D实现左右移动的敌人角色

环境与角色

创建敌人角色

简单起见,突出脚本的内容,我们就只创建一个圆形用来当做当前的敌人角色。
为分清左右,我们再为敌人角色添加一个眼睛,新建一个圆形精灵,更改其颜色为黑色,然后使其成为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方法来进行检测。

该方法需要传入三个参数:

  • 参数1:用于检测的圆心位置,我们可以使用GroundCheck的位置。
  • 参数2:检测的半径大小。
  • 参数3:检测的层。只有与这个层相交的物体才会被检测到。

调用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如何使用手机进行调试(真机)

猜你喜欢

转载自blog.csdn.net/weixin_44499065/article/details/132677385