版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
功能
- 利用动态添加动画事件,驱动技能相关的释放
- 点击J进行攻击释放
- 每次点击需要在下一段攻击时才会生效
实现
技能信息类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class SkillItemInfo
{
public int SkillListId;
public string SkillActionName;
public string ActionParamsName;
public int Index;
public SkillItemInfo(int skillListId, string skillActionName,string actionParamsName,int index)
{
SkillListId = skillListId;
SkillActionName = skillActionName;
ActionParamsName = actionParamsName;
Index = index;
}
}
角色控制类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CharacterCtrl : MonoBehaviour {
public Animator anim;
/// <summary>技能间隔已过去的时间</summary>
public float time;
/// <summary>技能之间的间隔</summary>
public float WaitTime = 0.15f;
/// <summary>敲击数</summary>
public int HitCount;
Dictionary<float, List<SkillItemInfo>> SkillList = new Dictionary<float, List<SkillItemInfo>>() { { 1,new List<SkillItemInfo>() {
new SkillItemInfo(1,"G_LP","Attack 1",0) ,
new SkillItemInfo(1,"G_RP","Attack 2",1) ,
new SkillItemInfo(1,"G_SpinJRK","Attack 3",2) ,
} } };
AnimationEvent curEventData;
void Start () {
AnimationClip[] infos = anim.runtimeAnimatorController.animationClips;
WaitTime = infos[0].length;
for (int i = 0; i < infos.Length; i++)
{
Debug.Log(infos[i].name);
int index=-1;
for (int j = 0; j < SkillList[1].Count; j++)
{
if(SkillList[1][j].SkillActionName== infos[i].name)
{
index = j;
}
}
AnimationEvent animationEndEvent= new AnimationEvent();
animationEndEvent.functionName = "OnAnimationEnd";
animationEndEvent.time = infos[i].length;
animationEndEvent.floatParameter = 1;
animationEndEvent.stringParameter = infos[i].name;
animationEndEvent.intParameter = index;
infos[i].AddEvent(animationEndEvent);
AnimationEvent animationStartEvent = new AnimationEvent();
animationStartEvent.functionName = "OnAnimationStart";
animationStartEvent.time = 0;
animationStartEvent.floatParameter = 1;
animationStartEvent.stringParameter = infos[i].name;
animationStartEvent.intParameter = index;
infos[i].AddEvent(animationStartEvent);
}
}
void Update () {
time += Time.deltaTime;
if (time>= WaitTime)
{
time = 0;
}
else
{
if (Input.GetKeyDown(KeyCode.J))
{
HitCount++;
}
}
if (HitCount > 0)
{
foreach (var item in SkillList)
{
anim.SetBool(item.Value[0].ActionParamsName, true);
}
}
}
public void OnAnimatorMove()
{
float SkillId = curEventData.floatParameter;
int skillIndex = curEventData.intParameter;
if (SkillList.ContainsKey(SkillId) && skillIndex != -1)
{
List<SkillItemInfo> skillItems = SkillList[SkillId];
if (skillIndex == skillItems.Count - 1)
{
HitCount = 0;
}
if (HitCount != 0)
{
if (!string.IsNullOrEmpty(skillItems[skillIndex + 1].ActionParamsName))
{
anim.SetBool(skillItems[skillIndex + 1].ActionParamsName, true);
}
}
else
{
for (int i = 0; i <= skillIndex; i++)
{
if (!string.IsNullOrEmpty(skillItems[i].ActionParamsName))
{
anim.SetBool(skillItems[i].ActionParamsName, false);
}
}
}
}
}
public void OnAnimationStart(AnimationEvent data)
{
HitCount = 0;
WaitTime = data.animatorClipInfo.clip.length;
curEventData = data;
}
public void OnAnimationEnd(AnimationEvent data)
{
}
}