[iOS] ๐ŸŽ‰ CAEmitterLayer ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

Charlieยท2024๋…„ 3์›” 14์ผ

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” CAEmitterLayer๋ฅผ ์ด์šฉํ•˜์—ฌ ํŠน์ • ์ด๋ฒคํŠธ ์„ฑ๊ณต ์‹œ ์ด๋ฅผ ์ถ•ํ•˜ํ•˜๋Š”(?) ๋А๋‚Œ์œผ๋กœ ์กฐ๊ธˆ ๋” ์žฌ๋ฐŒ๊ฒŒ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋†’์ด๊ณ ์ž ํ–ˆ๋˜ ์‹œ๋„์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์—์„œ ๊ธฐ์กด์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ฃผ๋ฌธ์„ ์™„๋ฃŒํ•˜๋ฉด ํ–…ํ‹ฑ์œผ๋กœ๋งŒ ์ฃผ๋ฌธ์˜ ์„ฑ๊ณต, ์‹คํŒจ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฃผ๋ฌธ ์„ฑ๊ณต ์‹œ ํ–…ํ‹ฑ์œผ๋กœ๋งŒ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ธฐ์—๋Š” ๋ญ”๊ฐ€ ๋ฐ‹๋ฐ‹ํ•˜๊ฒŒ ๋А๊ปด์ ธ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์„ฑ๊ณต์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ๋ณด๋‹ค ํ™•์‹คํ•˜๊ฒŒ ๋ฐ›์œผ๋ฉฐ ์„œ๋น„์Šค๋ฅผ ์žฌ๋ฐŒ๊ฒŒ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ ์ž CAEmitterLayer๋ฅผ ํ™œ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.






CAEmitterLayer

final class MyViewController: UIViewController {
	private let emitterLayer = CAEmitterLayer()
    
    override func viewDidAppear(_ animated: Bool) {
    	super.viewDidAppear(animated)
        self.startEntranceAnimation()
    }
    
	private func startEntranceAnimation() {
        self.emitterLayer.emitterPosition = CGPoint(x: Constant.Screen.screenWidth / 2, y: 130)
        self.emitterLayer.birthRate = 1
        self.emitterLayer.emitterCells = self.getEmojiEmitterCells()
        
        self.view.layer.addSublayer(self.emitterLayer)
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in
            self?.emitterLayer.birthRate = 0
        }
    }
    
    private func getEmojiEmitterCells() -> [CAEmitterCell] {
        return [/* emojis */].map { emoji in
            let cell = CAEmitterCell()
            cell.contents = emoji.image.resized(to: CGSize(width: 40, height: 40)).cgImage
            cell.lifetime = 3
            cell.birthRate = 14
            
            cell.scale = 0.3
            cell.scaleRange = 0.15
            
            cell.spin = 5
            cell.spinRange = 10
            
            cell.emissionRange = .pi * 2
            
            cell.velocity = 600
            cell.velocityRange = 50
            
            cell.yAcceleration = 1200
            
            return cell
        }
    }}




CAEmitterLayer configurations

  • emitterPosition : Cell๋“ค์ด ๋ฐฉ์ถœ ๋  ์œ„์น˜
  • birthRate : Layer์— ์†ํ•œ Cell๋“ค์˜ birthRate์™€ ๊ณฑํ•ด์ ธ ์ดˆ๋‹น Cell์˜ ์ƒ์„ฑ ๊ฐœ์ˆ˜๋ฅผ ๊ฒฐ์ •
  • emitterCells : ๋ฐฉ์ถœ๋  Cell๋“ค


CAEmitterCell configurations

  • contents : ๋ ˆ์ด์–ด์˜ ์ปจํ…์ธ . ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” cgImage๋กœ ๋ณ€ํ™˜ํ•œ ์ด๋ชจ์ง€๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • lifetime : Cell์˜ ์ˆ˜๋ช…(์ดˆ)
  • birthRate : Layer์˜ birthRate์™€ ๊ณฑํ•ด์ ธ ํ•ด๋‹น Cell์˜ ์ดˆ๋‹น ์ƒ์„ฑ๋˜๋Š” ๊ฐœ์ˆ˜
  • scale : Cell์˜ ์Šค์ผ€์ผ
  • scaleRange : Cell๋งˆ๋‹ค ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋Š” ์Šค์ผ€์ผ์˜ ๋ฒ”์œ„
  • spin : Cell์˜ ํšŒ์ „ ์†๋„
  • spineRange : Cell๋งˆ๋‹ค ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋Š” ํšŒ์ „ ์†๋„์˜ ๋ฒ”์œ„
  • emissionRange : Cell์ด ๋ฐฉ์ถœ๋˜๋Š” ๊ฐ๋„
  • velocity : Cell์˜ ์†๋„
  • velocityRange : Cell๋งˆ๋‹ค ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋Š” ์†๋„์˜ ๋ฒ”์œ„
  • yAcceleration : Cell์˜ y์ถ• ๊ฐ€์†๋„





๊ฒฐ๊ณผ






Reference

[Swift] ์นด์นด์˜คํ†ก ์†ก๊ธˆ ๋ด‰ํˆฌ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋”ฐ๋ผํ•˜๊ธฐ

profile
Hello

0๊ฐœ์˜ ๋Œ“๊ธ€