Unity——各种特效的基本使用方法
特效是游戏制作不可或缺的一环,作为游戏开发者最重要的工作就是将特效添加到游戏中,并在合适的时机、合适的位置将特效播放出来,同时还要注意特效的管理和销毁。
某些种类的特效,如动效、贴花,还要编写脚本代码以实现更细节的控制。因此本文将简单介绍各种特效的使用方法。
特效和动画的播放本身没有什么难点,很多时候只需要实例化物体即可。
1.创建粒子特效
在Asset Store中有一套适合学习和使用的免费粒子资源,名为Unity Particle Pack。这套素材在导入后可能会提示重启Unity,按照提示操作即可。以下借用这套素材进行说明。
在导入资源包后,找到粒子素材的prefab,例如EarthShatter。将其拖入场景即可立即预览效果。在选中特效物体时,还会在场景中出现一个小的工具窗口,可以方便地暂停、播放和重放粒子,而且还可以调整预览速度等。
查看这个资源文件,发现其扩展名为“.prefab”,选中后也可以看出,它确实只是一个普通的prefab文件。这个物体上挂载了Particle System(粒子组件),而且具有5个子物体,每个子物体也分别挂载了粒子组件。通过分别禁用每一个子物体,可以看到每个子物体的作用。例如,Rock Spike是生成的岩石的主体,Fire Embers是飞散的火花,Fire Ball是沿路径运动的火球等。如果分析了更多的粒子特效,会发现特效设计师往往是通过多个小特效的叠加来实现华丽而复杂的特效的。
从使用特效的角度来看,由于特效素材只是一个prefab,因此唯一要做的只是将它实例化出来而已,与创建任何一个物体没有区别。
创建一个空物体并挂载以下代码,运行游戏时按空格键就可以播放粒子了
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CreatParticle : MonoBehaviour
{public GameObject prefabParticle;void Update(){if(Input.GetButtonDown("Jump")){GameObject particle = Instantiate(prefabParticle);}}
}
2.粒子特效的生命周期
物体的生命周期主要是指物体从创建到销毁的过程。作为技术开发人员,可以不关心资源的制作,但一定要关心资源生命周期的管理。
粒子组件具有一定的播放时间,而且加入了与生命周期有关的选项,用于设置播放完成后的循环播放、停止播放或销毁自身。这些选项大体都在粒子组件的第一个编辑栏中。
粒子组件的绝大部分选项都影响着粒子的播放效果,由特效设计师负责,而某些选项则与粒子生命周期有关,需要技术开发者负责。
- Duration,粒子播放的总时间
- Looping,是否循环。该选项用于某些持续性特效,如篝火
- Play On Awake,创建时立即播放。如果没有勾选此项,在脚本创建子物体后需要调用Play函数
- Stop Action,粒子播放完成后的行为
- Ring Buffer Mode,是否启用环形缓冲区。环形缓冲区是一种类似对象池的程序优化技术,可以实现资源回收复用,极大减小创建和销毁资源的开销。这一选项与Max Particles(最大粒子数量)相关,是对当前粒子物体中大量粒子的优化
如果粒子创建后不自动播放,则用脚本播放的代码如下:
GameObject particle = Instantiate(prefabParticle);
//如果粒子没有勾选Play On Awake选项,就需要手动调用Play
ParticleSystem ps = particle.GetComponent<ParticleSystem>();
ps.play();
粒子选项中的Stop Action有以下几种选择
- None,什么都不做
- Disable,将当前物体禁用。如果稍后还要再播放,可以让粒子先自动禁用
- Destroy,摧毁当前物体。这是最简便易行的销毁粒子方法,不用写脚本。
- Callback,调用脚本方法,让脚本进行下一步处理。需要在粒子组件的物体上挂载脚本,其中粒子的回调方法如下
public void OnParticle SystemStopped() { Debug.Log("粒子停止"); }
一般来说,如果粒子播放一遍以后就没用了,最常见的办法应该是将Stop Action选项设置为Destroy,自动销毁物体。如果有其它特殊需求,就有多种销毁的思路。利润也,可以让脚本定时执行销毁,时间为Duration;也可以选择Callback,让粒子播放完成后通知脚本,在脚本的OnParticleSystemStopped方法中进一步处理。
3.创建动画特效
只需要用脚本把对应物体创建出来即可,略
4.定时销毁动画或动效
让动画或动效都能在一定时间后销毁,可以用组件化思路,设计一个通用化的脚本,事先制指定销毁时间,给所有创建的粒子或动画都挂载上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TimeDestroy : MonoBehaviour
{public float time = 1;void Start(){invoke("Destroy", time);}void Destroy(){Destroy(gameObject);}}
上述的代码用了Invoke方法延时调用,也可以用协程实现。这种思路非常通用,可以用在游戏中的粒子、子弹等各种物体上。
当然对于动画还可以用“动画帧事件”的方法。在动画最后一帧加上一个帧事件,调用脚本来销毁动画,但编辑大量动画会比较繁琐。
5.调整动画和粒子参数
大部分情况下不需要调整动画和粒子的参数,直接播放即可。有时会有一些特殊要求,如动画加减速播放、粒子改变整体时间等,实际的例子如下
GameObject particle = Instantiate(prefabParticle);
//如果粒子没有勾选Play On Awake选项,就需要手动调用Play
ParticleSystem ps = particle.GetComponent<ParticleSystem>();
//注意!不要再播放后修改参数,不支持
//因此测试本脚本必须取消勾选粒子的Play On Awake选项//获取主参数,即粒子组件界面上的第一组参数
ParticleSystem.MainMoudle main = ps.main;
main.duartion = 1; //改变总持续时间
main.startSpeed = 40; //改变初始速度
main.stopAction = ParticleSystemStopAction.Destroy; //改变播放一次后的行为//同理,获取发射参数
ParticleSystem.EmissionModule emission = ps.emission;
emission.rateOverTime = 1000; //加大发射频率ps.Play();
如上述代码所示,粒子的绝大部分参数都可以通过脚本修改。由于相关函数有改动,因此很多开发者遇到了编译错误。
以上代码中,必须把每个参数组先赋值给一个临时变量(如main或emission),然后再修改变量。然而不能用一行表达式直接修改参数,大致是因为MainModule和Emmision等类型都是结构体,而粒子系统用了特殊语法实现结构体数据和粒子组件的绑定,导致出现这种很少见的语法现象。
修改动画播放速度也是常见的需求,示例代码如下
//创建动画prefab
GameObejct obj = Instantiate(prefab);
//给都规划加上定时销毁脚本,并定时1秒
obj.AddComponent<TimeDestroy>.time = 1;//修改动画播放速度为2倍速
Animator anim = obj.GetComponent<Animator>();
anim.speed = 2;
相关文章:
Unity——各种特效的基本使用方法
特效是游戏制作不可或缺的一环,作为游戏开发者最重要的工作就是将特效添加到游戏中,并在合适的时机、合适的位置将特效播放出来,同时还要注意特效的管理和销毁。 某些种类的特效,如动效、贴花,还要编写脚本代码以实现…...
smiley-http-proxy-servlet 实现springboot 反向代理,结合项目鉴权,安全的引入第三方项目服务
项目中反向代理 集成第三方的服务接口或web监控界面,并实现与自身项目相结合的鉴权方法 依赖 smiley-http-proxy-servlet GitHub链接 2.0 版开始,代理切换到jakarta servlet-api<!--HTTP 代理 Servlet--><dependency><groupId>org.mit…...
(vue)多级表头且转为百分比显示
(vue)多级表头且转为百分比显示 <el-table-column align"center" label"近三个月数据情况"><el-table-column align"center" prop"amount" :label"tableLast[0]"><template slot-scope"{ row }"&g…...
Linux下C++开发
Linux下C开发 Linux 系统介绍 简介 Linux属于多用户多任务操作系统,而Windows属于单用户多任务操作系统Linux一切皆文件目录结构 bin 存储二进制可执行文件dev 存放的是外接设备,例如磁盘,光盘等。在其中的外接设备是不能直接被使用的&…...
GPT-3.5——从 人工智障 到 大人工智障
有人说,GPT是从人工智障到人工智能的蜕变,但是。。。 我认为,GPT是从 人工智障 到 大人工智障 的退化。。。 从 人工智障 到 大人工智障 GPT-3.5学术介绍No.1---- 西红柿炒钢丝球基本信息详细制作方法材料步骤 幕后花絮 No.2---- 顶尖数学家…...
创建型(四) - 原型模式
一、概念 原型模式(Prototype Pattern):利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。 使用场景:如果对象的创建成本比较大…...
ABAP 定义复杂的数据结构
最近有个需求是实现ABAP数据类型与JASON类型的转换。想要创建个ABAP的数据类型来接JASON类型是个挺麻烦的事。例如下面这个JASON数据,是个很简单的数据结构。但对ABAP来说有4层了,就有点复杂了。 不过ABAP的数据类型也是支持直接定义数据结构的嵌套的。如…...
HCIP第四节-----------------------------BGP
一、BGP基础 1、BGP得概述 (1)、AS OSPF、IS-IS等IGP路由协议在组织机构网络内部广泛应用,随着网络规模扩大,网络中路由数量不断增长,IGP已无法管理大规模网络,AS的概念由此诞生。 AS指的是在同一个组织…...
Temu闯关日韩受挫?跨境电商卖家如何打磨好营销链路
海外版拼多多 Temu 先后在日本和韩国上线,然而效果不似预期,日韩市场对这套“低价补贴”策略并不买账。作为一个尚未被日韩消费者熟悉的网站,其价格之便宜无法让消费者信任。除此之外更大的问题是,在日本卷不过线下零售与百元店&a…...
console的几个常用用法
console.log() 其一、主要表示:向 Web 控制台输出一条消息; 其二、而具体是什么信息就以传递的实参为准,然后就是在控制台就能显示自己传递参数的结果; console.log([1,3,5,7]) // 输出 [1, 3, 5, 7] console.log({}) // 输出 {} conso…...
服务器数据恢复-HP EVA存储VDISK被删除的数据恢复案例
服务器数据恢复环境: 某单位有一台HP EVA存储,连接2组扩展柜,扩展柜中有12块FATA磁盘和10块FC磁盘,不确定数量的LUN,主机安装WINDOWS SERVER操作系统,存储设备用来存放该单位的重要资料。 服务器故障初检&…...
(搜索) 剑指 Offer 13. 机器人的运动范围 ——【Leetcode每日一题】
❓剑指 Offer 13. 机器人的运动范围 难度:中等 地上有一个 m 行 n 列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外)&…...
Java并发编程之线程池详解
目录 🐳今日良言:不悲伤 不彷徨 有风听风 有雨看雨 🐇一、简介 🐇二、相关代码 🐼1.线程池代码 🐼2.自定义实现线程池 🐇三、ThreadPoolExecutor类 🐳今日良言:不悲伤 不彷徨 有风听风 有…...
开源数据库Mysql_DBA运维实战 (总结)
开源数据库Mysql_DBA运维实战 (总结) SQL语句都包含哪些类型 DDL DCL DML DQL Yum 安装MySQL的配置文件 配置文件:/etc/my.cnf日志目录:/var/log/mysqld.log错误日志:/var/log/mysql/error.log MySQL的主从切换 查看主…...
图神经网络与分子表征:1. 分子图和图神经网络基础
CSDN的朋友们大家好,好久没写系列文章了。 近期读了很多图神经网络(GNN)和分子表征(molecular representation)的论文,正好最近不是很忙,所以我决定把自己的学习过程记录下来,与大家…...
Spring Boot与Redisson的整合。分布式锁
Spring Boot与Redisson的整合可以帮助您在Spring Boot应用程序中使用分布式锁、缓存等功能。下面是一些基本步骤来整合Spring Boot与Redisson: 添加Maven/Gradle依赖: 在您的Spring Boot项目的pom.xml(Maven)或build.gradle&#…...
Lua中逻辑运算符and,or,not 区别与用法
在Lua中,逻辑运算符包括 and、or 和 not。它们用于对布尔值进行逻辑运算。 and运算符: 当同时满足两个表达式时,返回第二个表达式的值;否则,返回第一个表达式的值。如果第一个表 达式的值为false或nil,则…...
使用 spaCy 增强 NLP 管道
介绍 spaCy 是一个用于自然语言处理 (NLP) 的 Python 库。SpaCy 的 NLP 管道是免费且开源的。开发人员使用它来创建信息提取和自然语言理解系统,例如 Cython。使用该工具进行生产,拥有简洁且用户友好的 API。 如果您处理大量文本,您会想了解更多相关信息。例如,它是关于什…...
【HCIP】08.ISIS中间系统
链路状态协议,传递LSA信息ISIS基于数据链路层封装在OSI时,也有自己的网络层地址和自己的路由协议,即ISIS。之前的ISIS支持OSI的网络层地址,是为OSI中的CLNP(无连接网络协议)网络设计的路由协议,…...
Android 13 Framework 添加自定义的系统服务CustomService
目的: 添加自定义的系统服务,在自定义的服务中开发定制的API接口和功能,独立于系统核心服务,方便开发和维护。 开发环境:Android 13 MTK平台 涉及修改的文件如下 device/mediatek/sepolicy/base/private/service_contexts device/mediatek/sepolicy/base/vendor/platfo…...
前端食堂技术周刊第 95 期:Fresh 1.4、Rollup 迁移至 SWC计划、RSC Devtools、使用开源库的边界、AI 帮你讲论文
美味值:🌟🌟🌟🌟🌟 口味:冰葡美式 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 大家好,我是童欧巴。欢迎来到前端食堂技术周刊,我们先来看下…...
【TypeScript】枚举类型
在 TypeScript 中,枚举(Enum)是一种用于定义命名常量集合的数据类型。枚举使代码更加可读和可维护,因为它们为一组具有语义的值提供了命名。 以下是 TypeScript 中枚举的基本用法和特点: // 声明一个枚举 enum Direc…...
快速通过华为HCIP认证
你可以按照以下步骤进行准备和学习: 华为认证课程和资料--提取码:1234https://pan.baidu.com/s/1YJhD8QbocHhZ30MvrKm8hg 了解认证要求:查看华为官方网站上的HCIP认证要求和考试大纲,了解考试的内容、考试形式和考试要求。 学习相关知识&am…...
派森 #P124. 公式计算
描述 输入数正整数m,输出0! 1! ...m!的计算结果。 样例 输入 5 输出 154 代码: m int(input()) result 1 factorial 1 for i in range(1, m 1):factorial * iresult factorial print(result) # 法2def factorial(n):"""计…...
opencv进阶14-Harris角点检测-cv2.cornerHarris
类似于人的眼睛和大脑,OpenCV可以检测图像的主要特征并将这 些特征提取到所谓的图像描述符中。然后,可以将这些特征作为数据 库,支持基于图像的搜索。此外,我们可以使用关键点将图像拼接起 来,组成更大的图像。&#x…...
JVM中对象和GC Root之间的四种引用关系
1. 强引用 只有所有 GC Roots 对象都不通过【强引用】引用该对象,该对象才能被垃圾回收 由GC Root直接new出来的对象是强引用,只有当GC Root不再引用该对象的时候,才会被回收 例子: List<String> list new ArrayList<&…...
【李宏毅机器学习】注意力机制
输出 我们会遇到不同的任务,针对输出的不一样,我们对任务进行划分 给多少输出多少 给一堆向量,输出一个label,比如说情感分析 还有一种任务是由机器决定的要输出多少个label,seq2seq的任务就是这种,翻译也…...
Nginx使用keepalived配置VIP
VIP常用于负载均衡的高可用,使用VIP可以给多个主机绑定一个IP,这样,当某个负载应用挂了之后,可以自动切到另一个负载。 我这里是在k8s环境中做的测试,集群中有6个节点,我给140和141两个节点配置VIP。 1. 安…...
C语言编写图形界面
文章目录 环境使用库基础概念句柄 程序的入口创建窗口定义窗口类注册窗口类创建窗口 完整代码运行效果 环境 使用的是VSCode MinGW; 使用库 我们使用windows.h库来实现图形化界面。 头文件如下: #include <windows.h>windows.h是 Windows 操作…...
K8s学习笔记3
Kubernetes功能: Kubernetes是一个轻便的可扩展的开源平台,用于管理容器化应用和服务。通过Kubernetes能够进行应用的自动化部署和扩缩容。在Kubernetes中,会将组成应用的容器组合成一个逻辑单元以更易管理和发现。Kubernetes积累了作为Goog…...
湛江正规网站制作方案/头条新闻今日头条
树上启发式合并,静态链分治(DSU)一,讲解二,使用T1题目友好链接题解codeT2题目友好链接题解codeT3题目友好链接题解codeT4题目友好链接题解codeT5题目友好链接题解code一,讲解 https://www.acwing.com/solu…...
那个网站可以做网络兼职/中国营销网站
在武汉传智播客已经有两个月的时间了,我第一次看到了不一样的自己,因为我遇到你们,而你们比谁都相信努力奋斗的意义。 “人不迷茫枉少年”你们来传智播客之前,经历过各种各样的事情,不管你是初入社会的毕业生…...
wordpress站点标题字体/巨量算数数据分析入口
公司环境:略 二面面试时长:28分钟 如何实现分布式接口幂等性?如何保证数据一致性MySQL的间隙锁是什么?Redis的setNx锁有什么问题?HashMap数据结构?触发链表切换红黑树的条件是什么?Concurrnth…...
广州网站建设十年乐云seo/免费注册个人网站不花钱
最近雷卯电子EMC工程师接到很多同学关于液晶屏ESD失效的整改案例,其实非常建议电子工程师在设计时考虑esd防护,这里做一个科普。 1静电的产生 静电是一种客观存在的自然现象,产生的方式多种,如接触、摩擦、电器间感应等。静电的特…...
电子商务网站的建设包含哪些流程图/网站建设公司哪家好?
一.概述 1.层次聚类: "层次聚类"(Hierarchical Clustering)是1类聚类算法.这种算法会根据不同数据点间的相似度来逐级将数据点分入不同类别,从而创建出1 棵有层次的聚类树.原始数据点是这颗树的最低层,树的顶层则是包含全部数据的根节点.层次聚类又可分为"合并…...
福田附近做网站公司/北京seo课程培训
2019独角兽企业重金招聘Python工程师标准>>> 最近看了一个Google日本的企宣视频, 感觉超级好玩. 真是叹服Google日本的奇思妙想. 于是驱猫寻图, 找到了Google存放图片的地址. 然后编写了一个超级简单的脚本重现了该tabplay(前提是chrome为默认浏览器). 真是华丽... …...