【Unity2D:C#Script】制作敌人

一、制作敌人预制体

1. 在场景面板中添加敌人,并创建预制体

2. 设置敌人的锚点在底部

二、为敌人添加碰撞体积

1. 添加Box Collider 2D、Rigidbody 2D组件

2. 调整轴心点位置、层级、碰撞体积大小、刚体类型、锁定z轴

        Body Type(刚体类型):Dynamic:自身运动,也会被其他刚体推动;Kinematic:自身运动,但不会被其他刚体推动;Static:自身不动,也不会被其他刚体推动

        注意:敌人是碰撞器而不是触发器,所以不要勾选Is Trigger

三、编辑敌人脚本

1. 创建变量

public class Enemy : MonoBehaviour
{// 创建rigidbody2D对象Rigidbody2D rigidbody2d;// 定义速度变量private float speed = 3.0f;// 定义布尔变量,控制敌人移动是水平还是竖直方向public bool moveHorizontally = true;// 定义控制方向变量public int direction = 1;// 创建改变方向的时间间隔private const int ChangeDirectionTime = 3;// 创建改变方向的计时器private float changeDirectionTimer;
}

2. 初始化

public class Enemy : MonoBehaviour
{// 创建rigidbody2D对象Rigidbody2D rigidbody2d;// 定义速度变量private float speed = 3.0f;// 定义布尔变量,控制敌人移动是水平还是竖直方向public bool moveHorizontally = true;// 定义控制方向变量public int direction = 1;// 创建改变方向的时间间隔private const int ChangeDirectionTime = 3;// 创建改变方向的计时器private float changeDirectionTimer;void Start(){// 获取敌人刚体组件rigidbody2d = GetComponent<Rigidbody2D>();// 计时器 = 改变方向的时间间隔changeDirectionTimer = ChangeDirectionTime;}}

3. 编辑计时器、控制敌人移动

public class Enemy : MonoBehaviour
{// 创建rigidbody2D对象Rigidbody2D rigidbody2d;// 定义速度变量private float speed = 3.0f;// 定义布尔变量,控制敌人移动是水平还是竖直方向public bool moveHorizontally = true;// 定义控制方向变量public int direction = 1;// 创建改变方向的时间间隔private const int ChangeDirectionTime = 3;// 创建改变方向的计时器private float changeDirectionTimer;void Start(){// 获取敌人刚体组件rigidbody2d = GetComponent<Rigidbody2D>();// 计时器 = 改变方向的时间间隔changeDirectionTimer = ChangeDirectionTime;}void Update(){// 计时器每秒-1changeDirectionTimer -= Time.deltaTime;// 若计时器的值<0,改变方向,同时重置计时器的值if (changeDirectionTimer < 0) {direction *= -1;changeDirectionTimer = ChangeDirectionTime;}// 定义二维变量position,用来接收将要移动到的位置Vector2 position = rigidbody2d.position;// 改变position的值if(moveHorizontally) {position.x += speed * direction * Time.deltaTime;} else {position.y += speed * direction * Time.deltaTime;}// 控制敌人移动rigidbody2d.MovePosition(position);}}

4. Ruby和敌人碰撞的方法

public class Enemy : MonoBehaviour
{// 创建rigidbody2D对象Rigidbody2D rigidbody2d;// 定义速度变量private float speed = 3.0f;// 定义布尔变量,控制敌人移动是水平还是竖直方向public bool moveHorizontally = true;// 定义控制方向变量public int direction = 1;// 创建改变方向的时间间隔private const int ChangeDirectionTime = 3;// 创建改变方向的计时器private float changeDirectionTimer;void Start(){// 获取敌人刚体组件rigidbody2d = GetComponent<Rigidbody2D>();// 计时器 = 改变方向的时间间隔changeDirectionTimer = ChangeDirectionTime;}void Update(){// 计时器每秒-1changeDirectionTimer -= Time.deltaTime;// 若计时器的值<0,改变方向,同时重置计时器的值if (changeDirectionTimer < 0) {direction *= -1;changeDirectionTimer = ChangeDirectionTime;}// 定义二维变量position,用来接收将要移动到的位置Vector2 position = rigidbody2d.position;// 改变position的值if(moveHorizontally) {position.x += speed * direction * Time.deltaTime;} else {position.y += speed * direction * Time.deltaTime;}// 控制敌人移动rigidbody2d.MovePosition(position);}// 控制敌人和Ruby碰撞private void OnCollisionEnter2D(Collision2D collision) {Ruby ruby = collision.gameObject.GetComponent<Ruby>();if (ruby != null) {ruby.changeHealthPoint(-20);}}}

5. 添加敌人修复(即死亡效果)逻辑

        添加布尔变量broken,表示是否修理好;在Update方法中进行判断,若已经修理好则return(停止移动);新建fix方法,在敌人生命值为0时调用

public class Enemy : MonoBehaviour
{// 创建rigidbody2D对象Rigidbody2D rigidbody2d;// 敌人基础属性private int maxHealthPoint = 100;public int healthPoint;private float speed = 3.0f;private bool broken;// 定义布尔变量,控制敌人移动是水平还是竖直方向public bool moveHorizontally = true;// 定义控制方向变量public int direction = 1;// 创建改变方向的时间间隔private const int ChangeDirectionTime = 3;// 创建改变方向的计时器private float changeDirectionTimer;void Start(){// 获取敌人刚体组件rigidbody2d = GetComponent<Rigidbody2D>();// 计时器 = 改变方向的时间间隔changeDirectionTimer = ChangeDirectionTime;// 为当前生命值赋值healthPoint = maxHealthPoint;// 敌人初始时是故障的broken = true;}void Update(){if (broken == false) {return;}// 计时器每秒-1changeDirectionTimer -= Time.deltaTime;// 若计时器的值<0,改变方向,同时重置计时器的值if (changeDirectionTimer < 0) {direction *= -1;changeDirectionTimer = ChangeDirectionTime;}// 定义二维变量position,用来接收将要移动到的位置Vector2 position = rigidbody2d.position;// 改变position的值if(moveHorizontally) {position.x += speed * direction * Time.deltaTime;} else {position.y += speed * direction * Time.deltaTime;}// 控制敌人移动rigidbody2d.MovePosition(position);}// 控制敌人和Ruby碰撞private void OnCollisionEnter2D(Collision2D collision) {Ruby ruby = collision.gameObject.GetComponent<Ruby>();if (ruby != null) {ruby.changeHealthPoint(-20);}}// 敌人改变生命值public void changeHealthPoint(int value){healthPoint = Mathf.Clamp(healthPoint+value, 0, maxHealthPoint);if(healthPoint <= 0) {enemyFixed();}}// 敌人修复完成public void enemyFixed(){broken = false;}}

6. 添加敌人动画控制器逻辑

public class Enemy : MonoBehaviour
{// 创建rigidbody2D对象Rigidbody2D rigidbody2d;// 创建动画控制器对象Animator animator;// 敌人基础属性private int maxHealthPoint = 100;public int healthPoint;private float speed = 3.0f;private bool broken;// 定义布尔变量,控制敌人移动是水平还是竖直方向public bool moveHorizontally = true;// 定义控制方向变量public int direction = 1;// 创建改变方向的时间间隔private const int ChangeDirectionTime = 3;// 创建改变方向的计时器private float changeDirectionTimer;void Start(){// 获取敌人刚体组件rigidbody2d = GetComponent<Rigidbody2D>();// 获取动画控制器组件animator = GetComponent<Animator>();// 计时器 = 改变方向的时间间隔changeDirectionTimer = ChangeDirectionTime;// 为当前生命值赋值healthPoint = maxHealthPoint;// 敌人初始时是故障的broken = true;// 设置初始动画if(moveHorizontally == true) {animator.SetFloat("MoveX", direction);} else {animator.SetFloat("MoveY", direction);}}void Update(){if (broken == false) {return;}// 计时器每秒-1changeDirectionTimer -= Time.deltaTime;// 若计时器的值<0,改变方向,同时重置计时器的值,更改动画播放的方向if (changeDirectionTimer < 0) {direction *= -1;changeDirectionTimer = ChangeDirectionTime;if(moveHorizontally == true) {animator.SetFloat("MoveX", direction);} else {animator.SetFloat("MoveY", direction);}}// 定义二维变量position,用来接收将要移动到的位置Vector2 position = rigidbody2d.position;// 改变position的值if(moveHorizontally) {position.x += speed * direction * Time.deltaTime;} else {position.y += speed * direction * Time.deltaTime;}// 控制敌人移动rigidbody2d.MovePosition(position);}// 控制敌人和Ruby碰撞private void OnCollisionEnter2D(Collision2D collision) {Ruby ruby = collision.gameObject.GetComponent<Ruby>();if (ruby != null) {ruby.changeHealthPoint(-20);}}// 敌人改变生命值public void changeHealthPoint(int value){healthPoint = Mathf.Clamp(healthPoint+value, 0, maxHealthPoint);if(healthPoint <= 0) {enemyFixed();}}// 敌人修复完成public void enemyFixed(){broken = false;animator.SetTrigger("Fixed");}}

四、为敌人添加动画

                 动画混合树详细教程:【Unity】动画混合树

1. 在Assets/Art/Animations/Animator文件夹中,新建Enemy的Animator Controller文件

2. 创建Move状态混合树

        创建参数MoveX、MoveY(红色)

        设置混合类型为2D简单方向(蓝色)

        将两个参数设置为MoveX、MoveY(紫色)

        创建四个Motion(黄色)

        创建四个AnimationClip文件(敌人向四个方向移动的动画)并添加到Motion中(绿色)

        修改四个Motion的两个参数的值(粉色)

3. 新建Fixed State,将Move通向Fixed,新建Trigger类型的Fixed参数,点击Move通向Fixed的箭头,将条件设置为Fixed

 

4. 给敌人添加Animator组件,并挂载Enemy的Animator Controller文件

本章完。感谢阅读! 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络的基础理解

文章目录 网络的基础认识 网络协议协议分层OSI七层模型TCP/IP 五层/四层 模型 网络的基础认识 先来看下面几个问题 什么是网络&#xff1f; 网络就是有许多台设备包括计算机单不仅限于计算机&#xff0c;这些设备通过相互通信所组成起来系统&#xff0c;我们称之为网络所以如…

【动态规划七】背包问题

目录 0/1背包问题 一、【模板】01背包 二、分割等和子集 三、目标和 四、最后一块石头的重量 II 完全背包问题 一、【模板】完全背包 二、零钱兑换 三、零钱兑换 II 四、完全平方数 二维费用的背包问题 一、一和零 二、盈利计划 似包非包 组合总和 卡特兰数 不…

Sui生态DeFi项目Cetus和Aftermath宣布启动孵化器

Sui DeFi中的去中心化交易所Cetus和Aftermath Finance联合Sui基金会宣布启动新的孵化器&#xff0c;为初创项目提供更多可行性途径。这两个DeFi项目在Sui上有着较长的历史&#xff0c;自去年一同与主网推出以来&#xff0c;目前在TVL方面位居前五。这两个项目的持久性和成功使它…

《Effective Objective-C 2.0》读书笔记——接口与API设计

目录 第三章&#xff1a;接口与API设计第15条&#xff1a;用前缀避免命名空间冲突第16条&#xff1a;提供“全能初始化方法”第17条&#xff1a;实现description方法第18条&#xff1a;尽量使用不可变对象第19条&#xff1a;使用清晰而协调的命名方式第20条&#xff1a;为私有方…

计算机网络协议

网络协议 基于TCP的应用层协议 POP3&#xff08;Post Office Protocol 3&#xff09;&#xff1a; 用于支持客户端远程管理服务器上的电子邮件。它支持**“离线”邮件处理**&#xff0c;即邮件发送到服务器上后&#xff0c;一旦邮件被POP3客户端下载到本地计算机&#xff0c;…

Redis --学习笔记

Redis简介 一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件 特点&#xff1a; 基于内存存储&#xff0c;读写性能高 适合存储热点数据&#xff08;热点商品、资讯、新闻&#xff09; 企业应用广泛 Redis默认端口号为6379 Redis是用…

Unity射击游戏开发教程:(24)创造不同的敌人

在这篇文章中,我们将讨论添加一个可以承受多次攻击的新敌人和一些动画来使事情变得栩栩如生。敌人没有任何移动或射击行为。这将有助于增强未来敌人的力量。 我们将声明一个 int 来存储敌人可以承受的攻击数量,并将其设置为 3。

力扣刷题---1748.唯一元素的和【简单】

题目描述 给你一个整数数组 nums 。数组中唯一元素是那些只出现 恰好一次 的元素。 请你返回 nums 中唯一元素的 和 。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,2] 输出&#xff1a;4 解释&#xff1a;唯一元素为 [1,3] &#xff0c;和为 4 。 示例 2&#xff1a;…

NLP(16)--生成式任务

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 输入输出均为不定长序列&#xff08;seq2seq&#xff09;自回归语言模型&#xff1a; x 为 str[start : end ]; y为 [start1 : end 1] 同时训练多个字&#xff0c;逐字计算交叉熵 encode-decode结构&#xff1a; Encoder将输…

微服务远程调用 RestTemplate

Spring给我们提供了一个RestTemplate的API&#xff0c;可以方便的实现Http请求的发送。 同步客户端执行HTTP请求&#xff0c;在底层HTTP客户端库(如JDK HttpURLConnection、Apache HttpComponents等)上公开一个简单的模板方法API。RestTemplate通过HTTP方法为常见场景提供了模…

从ES5迈向ES6:探索 JavaScript 新增声明命令与解构赋值的魅力

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; ES5、ES6介绍 文章目录 &#x1f4af;声明命令 let、const&#x1f35f;1 let声明符&a…

【LeetCode】每日一题 2024_5_24 找出最具竞争力的子序列(栈,模拟,贪心)

文章目录 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01;题目&#xff1a;找出最具竞争力的子序列题目描述代码与解题思路 每天进步一点点 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 题目&#xff1a;找出最具竞争力的子序列 题目链接&a…

【Unity2D:C#Script】实现角色射击功能

一、创建子弹预制体 1. 创建子弹预制体 2. 调整图片大小、层级 二、为子弹添加碰撞体积 1. 添加Box Collider 2D、Rigidbody 2D组件 2. 锁定z轴 三、编辑敌人脚本 注&#xff1a;在以下代码中&#xff0c;只显示本章节新增的代码&#xff0c;省略原有的代码 1. 为敌人添加生…

一阶数字高通滤波器

本文的主要内容包含一阶高通滤波器公式的推导和数字算法的实现以及编程和仿真 1 计算公式推导 1.1.2 算法实现及仿真 利用python实现的代码如下&#xff1a; import numpy as np # from scipy.signal import butter, lfilter, freqz import matplotlib.pyplot as plt #2pifW…

免费分享一套微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端) Java毕业设计…

视频监控管理平台LntonCVS监控视频汇聚融合云平台主要功能应用场景介绍

随着网络技术的不断发展和万物互联时代的到来&#xff0c;视频融合在一些系统集成项目及综合管理应用中变得日益重要。本文以LntonCVS视频融合云平台为案例&#xff0c;探讨视频融合的对象及其应用场景。 1. 视频监控设备 视频监控摄像设备是各种视频应用项目的基础部分。在视…

亚马逊卖家账号注册复杂吗?需要什么辅助工具吗?

在当今数字化的商业世界中&#xff0c;亚马逊作为全球最大的电商平台之一&#xff0c;吸引着无数的卖家和买家。对于想要进入亚马逊销售市场的卖家来说&#xff0c;首先要完成的一项重要任务就是注册亚马逊卖家账号。本文将详细介绍亚马逊注册的步骤、所需时间&#xff0c;以及…

入门四认识HTML

一、HTML介绍 1、Web前端三大核心技术 HTML&#xff1a;负责网页的架构 CSS&#xff1a;负责网页的样式、美化 JS&#xff1a;负责网页的行动 2、什么是HTML HTML是用来描述网页的一种语言。 3、Html标签 单标签<html> 双标签<h>内容</h> 4、标…

【译】组复制和 Percona XtraDB 集群: 常见操作概述

原文地址&#xff1a;Group Replication and Percona XtraDB Cluster: Overview of Common Operations 在这篇博文中&#xff0c;我将概述使用 MySQL Group Replication 8.0.19&#xff08;又称 GR&#xff09;和 Percona XtraDB Cluster 8 (PXC)&#xff08;基于 Galera&…

服务器数据恢复—EVA存储多块硬盘离线导致部分LUN丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 1台某品牌EVA4400控制器3台EVA4400扩展柜28块FC硬盘。 服务器故障&#xff1a; 由于两块磁盘掉线导致存储中某些LUN不可用&#xff0c;某些LUN丢失&#xff0c;导致存储崩溃。 服务器数据恢复过程&#xff1a; 1、由于EVA4400存储故障是某些磁…