3-18 Spawning Particles At Runtime
本章要教大家如何在施放技能的時候,播放特定的粒子特效。上一章已經教過大家如何製作自己的粒子特效了,但因為我實在不擅長製作那些絢麗漂亮的效果,所以我直接下載Unity提供的Asset,也是非常好用又好看唷。若是大家仍想自己做的話,上一章有貼一些教學影片給大家。
Unity Particle Pack
https://www.assetstore.unity3d.com/en/#!/content/73777
接下來,請大家先匯入自己想要的粒子效果吧。然後將其中一個效果拉入場景中,測試看看在Player身上施放的效果如何。
這個效果好絢麗,我喜歡!
然後我們將Looping跟Play On Awake都關掉。
然後再將更改設定後的粒子效果拉進Area Effect變成新的Prefab,取名為AOE L1 Particle,我想將這個特效當作範圍攻擊的效果。我習慣將技能的粒子效果跟技能設定放在一起,比較好管理。放好以後,記得將剛剛於場景中測試的粒子效果刪除唷!接下來我們要用程式碼呼叫出效果。
將我們剛剛製作的粒子效果放進去。
玩遊戲測試看看吧,實際用起來效果還不錯呢!
慘了,快沒血了,趕快連放技能打倒Boss!
Unity Particle Pack
https://www.assetstore.unity3d.com/en/#!/content/73777
接下來,請大家先匯入自己想要的粒子效果吧。然後將其中一個效果拉入場景中,測試看看在Player身上施放的效果如何。
這個效果好絢麗,我喜歡!
然後我們將Looping跟Play On Awake都關掉。
然後再將更改設定後的粒子效果拉進Area Effect變成新的Prefab,取名為AOE L1 Particle,我想將這個特效當作範圍攻擊的效果。我習慣將技能的粒子效果跟技能設定放在一起,比較好管理。放好以後,記得將剛剛於場景中測試的粒子效果刪除唷!接下來我們要用程式碼呼叫出效果。
再來修改SpecialAbilityConfig.cs跟AreaEffectBehaviour.cs,讓粒子效果可以綁定到技能設定中。如果對接下來的修改看不懂的話,請先看看之前製作技能系統的文章唷!
3-9 Special Abilities System Overview
3-10 Create An Area Of Effect Ability
SpecialAbilityConfig.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; using RPG.Core; namespace RPG.Character{ public struct AbilityParams{ public IDamageable target; public float baseDamage; public AbilityParams(IDamageable target, float baseDamage){ this.target = target; this.baseDamage = baseDamage; } } public abstract class SpecialAbilityConfig : ScriptableObject { [Header("Special Ability General")] [SerializeField] float energyCost = 10f; [SerializeField] GameObject particlePrefab = null; abstract public ISpecialAbility AddComponent (GameObject gameObjectAttachTo); public float GetEnergyCost(){ return energyCost; } public GameObject GetParticlePrefab(){ return particlePrefab; } } }
AreaEffectBehaviour.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; using RPG.Core; namespace RPG.Character{ public class AreaEffectBehaviour : MonoBehaviour, ISpecialAbility { AreaEffectConfig config; public void SetConfig(AreaEffectConfig config){ this.config = config; } public void Use(AbilityParams useParams){ DealRadiaDamage (useParams); PlayParticleEffect (); } private void PlayParticleEffect(){ // 初始化粒子系統,綁定到Player身上 GameObject particlePrefab = Instantiate(config.GetParticlePrefab(),transform.position ,Quaternion.identity,transform); // 取得粒子系統物件 ParticleSystem myParticle = particlePrefab.GetComponent(); // 啟動粒子系統 myParticle.Play(); // 播放完後自我銷毀 Destroy(particlePrefab, myParticle.main.duration); } private void DealRadiaDamage(AbilityParams useParams){ RaycastHit[] hits = Physics.SphereCastAll ( transform.position, // 以Player為中心點 config.GetRadius (), // 掃描的球體半徑範圍 Vector3.up, // 掃描的方向不重要,因為我們發動的是Player為原點的範圍技 config.GetRadius () // 掃描距離設定成跟掃描半徑一樣即可 ); foreach (RaycastHit hit in hits) { Enemy enemy = hit.collider.gameObject.GetComponent (); if (enemy != null) { float damageToDeal = useParams.baseDamage + config.GetDamageToEachTarget (); enemy.TakeDamage (damageToDeal); } } } } }
接著,在AOE L1的Inspector中可以看到Particle Prefab。
將我們剛剛製作的粒子效果放進去。
玩遊戲測試看看吧,實際用起來效果還不錯呢!
慘了,快沒血了,趕快連放技能打倒Boss!
留言
張貼留言