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

news2024/12/24 10:27:44

文章目录

  • 环境与角色
    • 创建敌人角色
  • 敌人脚本
    • 检测前方是否有地面
      • 获取检测点
      • 检测地面
  • 完整代码
  • 运行结果
  • 其他文章

环境与角色

创建敌人角色

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/971938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时序预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神…

APACHE NIFI 删除组件报错

报错信息&#xff1a; Node 192.168.93.206:8443 is unable to fulfill this request due to: Controller Service 0e733621-f4ad-139e-8a25-8ad317eb6453 cannot be deleted because it is not disabled 步骤1&#xff1a;进入报错的流程里面&#xff0c;我的是到报错的Proce…

Arduino驱动LX1972传感器(光照传感器篇)

LX1972环境光(可见光)传感器,对可见光照度的反应特性与人眼的特性类似,可以模拟人对环境光线的强度的判断,从而方便做出与人友好互动的应用,可应用于照明控制、屏幕背光控制等。 1、传感器特性 传感器技术指标如下: 工作温度: -40~80C照度范围: 1 – 800Lux输出信号:…

【虹科干货】基本元件可靠性测试方案

01 内容摘要 本文介绍了一种基于可变形测试模块的电感和电阻测试系统&#xff0c;旨在解决传统手动测量方法存在的局限性和需求提升的问题。 该系统通过引入可变形测试模块、大规模矩阵和配套设备&#xff0c;实现了电感和电阻的大规模自动化测试。基于可变形测试模块的电感和…

MySQL——连接查询与子查询

一、连接查询 单表查询&#xff1a;在一张表当中查询数据&#xff0c;叫做单表查询。 连接查询&#xff0c;结合俩&#xff08;多&#xff09;张表&#xff0c;在俩张&#xff08;多&#xff09;表当中查询数据&#xff0c;在一张表当中查询一部分&#xff0c;在另一张表当中…

10.(Python数模)(预测模型二)LSTM回归网络(1→1)

LSTM回归网络&#xff08;1→1&#xff09; 长短期记忆网络 - 通常只称为“LSTM” - 是一种特殊的RNN&#xff0c;能够学习长期的规律。 它们是由Hochreiter&#xff06;Schmidhuber&#xff08;1997&#xff09;首先提出的&#xff0c;并且在后来的工作中被许多人精炼和推广。…

31 WEB漏洞-文件操作之文件包含漏洞全解

目录 文件包含漏洞原理检测类型利用修复 本地包含-无限制&#xff0c;有限制远程包含-无限制&#xff0c;有限制各种协议流玩法文章介绍读取文件源码用法执行php代码用法写入一句话木马用法每个脚本支持的协议玩法 演示案例某CMS程序文件包含利用-黑盒CTF-南邮大&#xff0c;i春…

ChatGPT 制作转化率分析漏斗图的制作

像这样的转换率漏斗图使用前端可视化技术就可以完成。 使用ChatGPT OpenAI来完成代码的编写。 我们将完整的代码给大家复制到下面: <!DOCTYPE html> <html> <head><meta charset="utf-8"><title>ECharts</title><!-- 引入…

如何在IPhone 14、14 Pro和14 Pro Max上添加屏幕锁定

当你第一次获得iPhone时&#xff0c;系统会提示你为它创建一个密码&#xff0c;这样只有你才能访问它。你应该使用一个必须输入的密码&#xff0c;以便在iPhone 14被唤醒或打开时解锁它。这将提供更高级别的保护。当你打开数据保护时&#xff0c;iPhone上的数据会被加密&#x…

恒运资本:沪指涨逾1%,金融、地产等板块走强,北向资金净买入超60亿元

4日早盘&#xff0c;两市股指盘中强势上扬&#xff0c;沪指、深成指涨超1%&#xff0c;上证50指数涨近2%&#xff1b;两市半日成交约5500亿元&#xff0c;北向资金大举流入&#xff0c;半日净买入超60亿元。 截至午间收盘&#xff0c;沪指涨1.12%报3168.38点&#xff0c;深成指…

Vue——vue3中的ref和reactive数据理解以及父子组件之间props传递的数据

ref()函数 这是一个用来接受一个内部值&#xff0c;返回一个响应式的、可更改的 ref 对象&#xff0c;此对象只有一个指向其内部值的属性 .value。 作用&#xff1a;创建一个响应式变量&#xff0c;使得某个变量在发生改变时可以同步发生在页面上。 模板语句中使用这个变量时…

解决外接显示器后Edge浏览器地址栏等变得很大的问题

解决外接显示器后Edge浏览器地址栏等变得很大的问题 edge设置里外观——触控模式&#xff0c;把触控模式关了

uni-app 之 v-on:click点击事件

uni-app 之 v-on:click点击事件 image.png <template><!-- vue2的<template>里必须要有一个盒子&#xff0c;不能有两个&#xff0c;这里的盒子就是 view--><view>--- v-on:click点击事件 ---<view v-on:click"onclick">{{title}}<…

浅谈Mysql读写分离的坑以及应对的方案 | 京东云技术团队

一、主从架构 为什么我们要进行读写分离&#xff1f;个人觉得还是业务发展到一定的规模&#xff0c;驱动技术架构的改革&#xff0c;读写分离可以减轻单台服务器的压力&#xff0c;将读请求和写请求分流到不同的服务器&#xff0c;分摊单台服务的负载&#xff0c;提高可用性&a…

华为OD机试 - 等和子数组最小和 - 深度优先搜索(Java 2022 Q4 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》…

ApiPost7使用介绍 | HTTP Websocket

一、基本介绍 创建项目&#xff08;团队下面可以创建多个项目节点&#xff0c;每个项目可以创建多个接口&#xff09;&#xff1a; 参数描述库&#xff08;填写参数时自动填充描述&#xff09;&#xff1a; 新建环境&#xff08;前置URL、环境变量很有用&#xff09;&#x…

docker save docker export 区别

docker save用于导出镜像到文件&#xff0c;包含镜像元数据和历史信息&#xff1b;docker export用于将当前容器状态导出至文件&#xff0c;类似快照&#xff0c;所以不包含元数据及历史信息&#xff0c;体积更小&#xff0c;此外从容器快照导入时也可以重新指定标签和元数据信…

单臂路由实现VLAN间路由

单臂路由实现VLAN间路由 单臂路由 概述拓扑图PC配置LSW2 接入层交换机LSW3 接入层交换机LSW1 汇聚层交换机R1 路由器ping 测试 单臂路由 概述 单臂路由的原理是通过一台路由器&#xff0c;使 VLAN 间互通数据通过路由器进行三层转发。 如果在路由器上为每个 VLAN 分配一个单独…

uniapp实现微信小程序全局可分享功能

uniapp实现微信小程序全局【发送给朋友】、【分享到朋友圈】、【复制链接】 主要使用 Vue.js 的 全局混入 1.创建一个全局分享的js文件。示例文件路径为&#xff1a;./utils/shareWx.js &#xff0c;在该文件中定义全局分享的内容&#xff1a; export default {data() {retur…

QT建立TCP服务器

QT core gui network *************************************************** #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器头文件 #include <QTcpSocket>//客户端头文件 #include <QList>//存放客户端…