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!









留言
張貼留言