Related Posts Plugin for WordPress, Blogger...

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,我想將這個特效當作範圍攻擊的效果。我習慣將技能的粒子效果跟技能設定放在一起,比較好管理。放好以後,記得將剛剛於場景中測試的粒子效果刪除唷!接下來我們要用程式碼呼叫出效果。

再來修改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!


留言