粒子系統(tǒng)介紹
-
什么是粒子系統(tǒng)?
- 粒子系統(tǒng)是由總體具有相同的表現(xiàn)規(guī)律,個(gè)體卻隨機(jī)表現(xiàn)出不同的特征的大量顯示元素構(gòu)成的集合。
-
粒子定義有三要素
- 群體性:粒子系統(tǒng)是由“大量顯示元素”構(gòu)成的(例如雪、雨、一團(tuán)霧等等)
- 統(tǒng)一性:粒子系統(tǒng)的每個(gè)元素具有相同的表現(xiàn)規(guī)律(例如下雨、下雪,方向都是從上向下)
- 隨機(jī)性:粒子系統(tǒng)的每個(gè)元素又隨機(jī)表現(xiàn)出不同特征(例如下雪,每個(gè)雪花下落的速度會(huì)有不同,大小會(huì)有不同、方向也會(huì)有略微的不同)
粒子系統(tǒng)應(yīng)用場(chǎng)景
- 影視行業(yè)
- 目前我們經(jīng)常看的大片,比如沙塵暴、暴風(fēng)雨、暴雪、煙花 等等,很多都是粒子特效做出來的。很逼真,而且相比真實(shí)世界中去實(shí)拍,成本要低很多
- 游戲中
- 爆炸、雨、雪、霧、煙花等等。都是粒子系統(tǒng)實(shí)現(xiàn)
- 應(yīng)用中
- 主播房間右下角粒子動(dòng)畫
- 雪花/下雨/煙花等效果
- QQ生日快樂一堆表情的跳動(dòng)
粒子系統(tǒng)的使用
- 步驟
- 創(chuàng)建發(fā)射器
- 創(chuàng)建粒子, 設(shè)置粒子屬性
- 代碼
protocol Emitterable {
}
extension Emitterable where Self : UIViewController {
func startEmittering(_ point : CGPoint) {
// 1.創(chuàng)建發(fā)射器
let emitter = CAEmitterLayer()
// 2.設(shè)置發(fā)射器的位置
emitter.emitterPosition = point
// 3.開啟三維效果
emitter.preservesDepth = true
// 4.創(chuàng)建粒子, 并且設(shè)置例子相關(guān)的屬性
let cell = CAEmitterCell()
// 4.2.設(shè)置粒子速度
cell.velocity = 150
cell.velocityRange = 100
// 4.3.設(shè)置例子的大小
cell.scale = 0.7
cell.scaleRange = 0.3
// 4.4.設(shè)置粒子方向
cell.emissionLongitude = CGFloat.pi / 2
cell.emissionRange = CGFloat.pi / 6
// 4.5.設(shè)置例子的存活時(shí)間
cell.lifetime = 3
cell.lifetimeRange = 1.5
// 4.6.設(shè)置粒子旋轉(zhuǎn)
cell.spin = CGFloat.pi / 2
cell.spinRange = CGFloat.pi / 4
// 4.6.設(shè)置例子每秒彈出的個(gè)數(shù)
cell.birthRate = 2
// 4.7.設(shè)置粒子展示的圖片
cell.contents = UIImage(named: "imageName")?.cgImage
// 5.將粒子設(shè)置到發(fā)射器中
emitter.emitterCells = [cell]
// 6.將發(fā)射器的layer添加到父layer中
view.layer.addSublayer(emitter)
}
/// 移除CAEmitterLayer
func stopEmittering() {
view.layer.sublayers?.filter({ $0.isKind(of: CAEmitterLayer.self)}).first?.removeFromSuperlayer()
}
}