大家先看一下 最后可以实现的效果
极简版技能编辑器效果
注:代码里有详细讲解 有我没有描述清楚的欢迎在下方留言
实现这种技能编辑器需要哪些步骤???
1.Editor文件夹的使用及创建
1.1、两个脚本文件
(1)、用于创建窗口 编辑人物Model 和 技能名称的脚本
(2)、用于编辑人物技能组件的显示存储脚本
2.Scripts脚本的编写
2.1、两个必要使用的脚本文件
(1)、人物实体与组件的绑定使用脚本
(2)、创建人物技能组件所使用的基类脚本
我们大体的说了一下实现以上功能的需求 下面我们用代码与讲解详细的分析一下它的步骤
写代码我们要分清楚主次与流程 知道了主次就知道先去做哪些事情也有了一个合理的有序的思路
1.这里呢我们先去写技能基类与玩家实体
技能基类代码示例(请结合后面的玩家实体代码观看):
using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 组件类型
/// </summary>
public enum TypeInfo
{
None,
动画,
声音,
特效,
}
public class PlayerInfo
{
public string skillName;//技能名称
public string icon;//技能图片
public List<SKillBase> skills = new List<SKillBase>();//存放技能的库
}
/// <summary>
/// 技能基类
/// </summary>
public class SKillBase
{
//[JsonIgnore] 忽略序列化,就是当字段在序列化时,被[JsonIgnore]标记了的字段将被忽略序列化
public string clipPath; //元件路径
public float delayTime; //延迟时间
[JsonIgnore] public PlayerEntity playerEntity;//玩家实体
public TypeInfo type;//组件类型
//虚方法 --初始化 --播放 --暂停
public virtual void Init(PlayerEntity player)
{
//初始化时将其与玩家实体进行绑定
playerEntity = player;
}
public virtual void Play()
{
}
public virtual void Stop()
{
}
}
/// <summary>
/// 动画组件 Animator的更改替换
/// </summary>
public class Skill_Anim : SKillBase
{
//动画元件
[JsonIgnore] public AnimationClip clip;
public override void Init(PlayerEntity player)
{
base.Init(player);
//拿到加载对应路径得到的动画元件
clip = Resources.Load<AnimationClip>("Anim/" + clipPath);
}
/// <summary>
/// 切换并播放动画的原理
/// </summary>
public override void Play()
{
base.Play();
playerEntity.m_animOver["Start"] = clip;
playerEntity.m_anim.SetTrigger("Play");
}
/// <summary>
/// 停止动画的原理
/// </summary>
public override void Stop()
{
base.Stop();
playerEntity.m_anim.StopPlayback();
playerEntity.m_animOver["Idle"] = Resources.Load<AnimationClip>("Anim/Idle");
playerEntity.m_anim.SetTrigger("Play");
}
}
/// <summary>
/// 音乐组件 Audio的更改替换
/// </summary>
public class Skill_Audio : SKillBase
{
//声音元件
[JsonIgnore] public AudioClip clip;
public override void Init(PlayerEntity player)
{
base.Init(player);
//拿到加载对应路径得到的音乐元件
clip = Resources.Load<AudioClip>("Audio/" + clipPath);
}
/// <summary>
/// 切换并播放音乐的原理
/// </summary>
public override void Play()
{
base.Play();
playerEntity.m_audio.Play();
}
/// <summary>
/// 停止音乐的原理
/// </summary>
public override void Stop()
{
base.Stop();
playerEntity.m_audio.Stop();
}
}
/// <summary>
/// 特效(GameObject)组件 Effect的更改替换
/// </summary>
public class Skill_Effect : SKillBase
{
//特效元件
[JsonIgnore] public GameObject clip;
//特效实例
[JsonIgnore] public GameObject effect;
public override void Init(PlayerEntity player)
{
base.Init(player);
//拿到加载对应路径得到的特效元件
clip = Resources.Load<GameObject>("Effect/" + clipPath);
}
/// <summary>
/// 切换并播放特效的原理
/// </summary>
public override void Play()
{
base.Play();
effect = GameObject.Instantiate(clip, playerEntity.transform);
effect.GetComponent<ParticleSystem>().Play();
}
/// <summary>
/// 停止特效的原理
/// </summary>
public override void Stop()
{
base.Stop();
effect.GetComponent<ParticleSystem>().Stop();
}
}
人物实体(请结合前面的技能基类代码观看):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 玩家实体
/// </summary>
public class PlayerEntity : MonoBehaviour
{
public string m_playerName;//玩家名称
public PlayerInfo m_Info;//对于技能基类的引用
public List<PlayerInfo> skills = new List<PlayerInfo>();//人物技能列表的存储库
public AudioSource m_audio;//音乐组件
public Animator m_anim;//动画组件
public AnimatorOverrideController m_animOver;//替换使用的特定动画但保留其原始结构的组件
public RuntimeAnimatorController m_runTimeAnim;//人物身上挂载的常见动画控制器 用于运行时动画的操作
public void OnInit(string playerName)
{
m_playerName = playerName;
//获取玩家身上的音乐、动画组件
m_audio = GetComponent<AudioSource>();
m_anim = GetComponent<Animator>();
//拿到动画控制器
m_runTime