入職以來一直很想實(shí)現(xiàn)一個(gè)技能編輯器,在積累了一些經(jīng)驗(yàn)以后,決定利用ScriptableObject開發(fā)一個(gè),在此記錄
1.簡(jiǎn)單的需求分析
在游戲開發(fā)中,技能系統(tǒng)是一個(gè)至關(guān)重要的組成部分。技能決定了游戲角色可以執(zhí)行的各種動(dòng)作,例如攻擊、治療、移動(dòng)等。通常,技能由多個(gè)元素組成,包括技能效果(Effect)、技能觸發(fā)條件(triggerr)、技能冷卻時(shí)間(Cooldown)等。為了更好地管理和調(diào)整這些技能,我們需要一個(gè)可視化的編輯器。
2.粗略的實(shí)現(xiàn)哪些功能
Buff 類似計(jì)時(shí)器功能 startscript endscript delaytime(開始延時(shí)時(shí)間) lasttime(buff持續(xù)時(shí)間-1為永久) TrickTime(腳本執(zhí)行間隔) TrickScript(持續(xù)時(shí)間內(nèi)按間隔時(shí)間刷新執(zhí)行的腳本)
Trigger 一些事件觸發(fā) 觸發(fā)條件 判斷是否執(zhí)行后續(xù)腳本 觸發(fā)后執(zhí)行的腳本,要在特定位置埋下事件
Effect 生成bullet 執(zhí)行Script (設(shè)計(jì)一個(gè)skillbyEffect 憑此釋放技能可以讓怪物NPC靠Buff釋放技能)
Bullet 子彈 子彈形態(tài) 鏈接track
Skill 技能應(yīng)該具有各種屬性,包括傷害、冷卻時(shí)間、目標(biāo)、范圍等。編輯器需要允許用戶定義這些屬性,并且能夠?qū)?Effect、Buff 和 Bullet 與技能關(guān)聯(lián)。
3.ScriptableObject的意義
可以創(chuàng)建多個(gè)不同類型的ScriptableObject,例如Skill、Buff、Effect、Bullet等,以滿足不同的需求。
ScriptableObject的數(shù)據(jù)是獨(dú)立的,它們不依賴于特定的場(chǎng)景或游戲?qū)ο?。這使得技能可以輕松地跨不同場(chǎng)景和游戲?qū)ο蠊蚕砗椭赜谩?br> 腳本化操作:可以通過腳本在運(yùn)行時(shí)創(chuàng)建、修改和管理ScriptableObject。
例如
using UnityEngine;
using UnityEngine.Events;
[CreateAssetMenu(fileName = "New Skill", menuName = "Skill System/Skill")]
public class SkillSo : ScriptableObject
{
[SerializeField]
public SkillType skillType;
[SerializeField]
public AttackType attackType;
[SerializeField]
public float spiritCost;
[SerializeField]
public float damageRatio;
[SerializeField]
public float skillCD;
public float lifeTime;
public Vector3 direction;
public float speed;
public float damage = 1f;
}
[CreateAssetMenu(fileName = “New Skill”, menuName = “Skill System/Skill”)] 是一個(gè)特性(Attribute),用于在Unity編輯器中創(chuàng)建新的技能資產(chǎn)(Asset)。它指定了在Unity項(xiàng)目中創(chuàng)建新技能時(shí)的默認(rèn)文件名和菜單路徑。這使得在Unity編輯器中可以右鍵點(diǎn)擊創(chuàng)建新技能,并將其保存為一個(gè)ScriptableObject。
下面一系列的 public 字段是用來存儲(chǔ)技能的各種屬性和參數(shù)。這些字段包括:
skillType:技能的類型,可能是一個(gè)自定義枚舉類型 SkillType。
attackType:技能的攻擊類型,可能是一個(gè)自定義枚舉類型 AttackType。
spiritCost:使用技能所需的精力消耗。
damageRatio:技能的傷害比率。
skillCD:技能的冷卻時(shí)間。
lifeTime:技能在游戲中存在的時(shí)間。
direction:技能的方向。
speed:技能的速度。
damage:技能的傷害值,默認(rèn)為1。
后續(xù)我可能會(huì)擴(kuò)展它和SkillType的枚舉
在編寫這段代碼后即可右鍵創(chuàng)建so文件
using System;
// 技能類型枚舉
public enum SkillType
{
MeteorSword, // 隕劍術(shù)
SkySword, // 天劍
SpeedBuff, // 速度增益
SwordRain, // 劍雨
WaterDrawSword, // 提水劍
None // 無(wú)
}
一個(gè)簡(jiǎn)單的skillType枚舉
然后設(shè)計(jì)一個(gè)skill基類去讀取和利用其中的信息
public abstract class SkillBase : MonoBehaviour
{
public SkillSo so;
public SkillType GetSkillType()
{
return so.skillType;
}
public AttackType GetAttackType()
{
return so.attackType;
}
public float SpiritCost()
{
return so.spiritCost;
}
public float DamageRatio()
{
return so.damageRatio;
}
public float SkillCD()
{
return so.skillCD;
}
protected void Awake()
{
so.sr = base.GetComponentInChildren<SpriteRenderer>();
}
protected virtual void SkillFinish()
{
UnityEngine.Object.Destroy(base.gameObject);
}
}
后續(xù)應(yīng)該在skillbase寫一些邏輯去處理,例如對(duì)外提供skill圖標(biāo)讓UImanager加載,對(duì)碰撞或范圍內(nèi)的敵人造成傷害。
在貼一個(gè)attackType
using System;
// 攻擊類型枚舉
public enum AttackType
{
Metal, // 金
Wood, // 木
Water, // 水
Fire, // 火
Earth, // 土
Thunder, // 雷
Sword, // 劍
None // 無(wú)
}
然后我會(huì)設(shè)計(jì)palyerManager去讀取預(yù)制體身上實(shí)例的SkillSo文件進(jìn)行相應(yīng)的處理文章來源:http://www.zghlxwxcb.cn/news/detail-705435.html
今天就先分享到這,管他能不能用,先寫了再說文章來源地址http://www.zghlxwxcb.cn/news/detail-705435.html
到了這里,關(guān)于Unity 從0開始編寫一個(gè)技能編輯器_01_分析需求的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!