284 lines
6.9 KiB
C#
284 lines
6.9 KiB
C#
/*
|
||
********************************************************************************
|
||
*Copyright(C),coolae.net
|
||
*Author: chenbin
|
||
*Version: 2.0
|
||
*Date: 2017-01-09
|
||
*Description: 角色动作
|
||
/// 注意: 通过tag来判断当前正在执行状态是否为设置的状态,
|
||
/// 因此在创建控制器中要把状态的tag的值与该文件中的ActionValue保持一至
|
||
*Others:
|
||
*History:
|
||
*********************************************************************************
|
||
*/
|
||
using UnityEngine;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using System;
|
||
|
||
namespace Coolape
|
||
{
|
||
public class CLRoleAction : MonoBehaviour
|
||
{
|
||
Animator _animator = null;
|
||
|
||
public Animator animator {
|
||
get {
|
||
if (_animator == null) {
|
||
_animator = GetComponent<Animator>();
|
||
}
|
||
return _animator;
|
||
}
|
||
}
|
||
|
||
public enum Action
|
||
{
|
||
idel,
|
||
//0 空闲
|
||
idel2,
|
||
//1 空闲
|
||
walk,
|
||
//2 走
|
||
run,
|
||
//3 跑
|
||
jump,
|
||
//4 跳
|
||
slide,
|
||
//5 滑行,滚动,
|
||
drop,
|
||
//6 下落,击飞
|
||
attack,
|
||
//7 攻击
|
||
attack2,
|
||
//8 攻击2
|
||
skill,
|
||
//9 技能
|
||
skill2,
|
||
//10 技能2
|
||
skill3,
|
||
//11 技能3
|
||
skill4,
|
||
//12 技能4
|
||
hit,
|
||
//13 受击
|
||
dead,
|
||
//14 死亡
|
||
happy,
|
||
//15 高兴
|
||
sad,
|
||
//16 悲伤
|
||
up,
|
||
//17 起立
|
||
down,
|
||
//18 倒下
|
||
biggestAK,
|
||
//19 最大的大招
|
||
dizzy,
|
||
//20 晕
|
||
stiff,
|
||
//21 僵硬
|
||
idel3,
|
||
//22 空闲
|
||
}
|
||
|
||
public static Action getActByName(string name)
|
||
{
|
||
try {
|
||
return (Action)(Enum.Parse(typeof(Action), name));
|
||
} catch (Exception e) {
|
||
return Action.idel;
|
||
}
|
||
}
|
||
|
||
// public void Start()
|
||
// {
|
||
// setAction (Action.walk, null);
|
||
// }
|
||
|
||
public void pause()
|
||
{
|
||
animator.enabled = false;
|
||
enabled = false;
|
||
}
|
||
|
||
public void regain()
|
||
{
|
||
animator.enabled = true;
|
||
enabled = true;
|
||
}
|
||
|
||
public Action currAction = Action.idel;
|
||
public int currActionValue = -1;
|
||
int cbCount = 1;
|
||
|
||
public void setSpeedAdd(float addSpeed)
|
||
{
|
||
animator.speed = 1 + addSpeed * 0.5f;
|
||
}
|
||
|
||
public void setAction(Action action, object onCompleteMotion)
|
||
{
|
||
setAction((int)action, onCompleteMotion);
|
||
}
|
||
|
||
Coroutine coroutineAction;
|
||
|
||
public void setAction(int actionValue, object onCompleteMotion)
|
||
{
|
||
__setAction(actionValue, onCompleteMotion); //为了做回放,不能用StartCoroutine
|
||
|
||
/*
|
||
#if UNITY_4_6 || UNITY_5 || UNITY_5_6_OR_NEWER
|
||
if(coroutineAction != null) {
|
||
StopCoroutine(coroutineAction);
|
||
coroutineAction = null;
|
||
}
|
||
coroutineAction = StartCoroutine(_setAction(actionValue, onCompleteMotion, 0.01f));
|
||
#else
|
||
Debug.LogError ("This function cannot surport current version unity!!!");
|
||
#endif
|
||
*/
|
||
}
|
||
|
||
IEnumerator _setAction(int actionValue, object onCompleteMotion, float sec)
|
||
{
|
||
yield return new WaitForSeconds(sec);
|
||
__setAction(actionValue, onCompleteMotion);
|
||
}
|
||
|
||
void __setAction(int actionValue, object onCompleteMotion)
|
||
{
|
||
if (onCompleteMotion != null && onCompleteMotion.GetType() == typeof(ArrayList)) {
|
||
doSetActionWithCallback(actionValue, (ArrayList)onCompleteMotion);
|
||
} else {
|
||
ArrayList list = null;
|
||
if (onCompleteMotion != null) {
|
||
list = new ArrayList();
|
||
list.Add(100);
|
||
list.Add(onCompleteMotion);
|
||
}
|
||
doSetActionWithCallback(actionValue, list);
|
||
}
|
||
}
|
||
|
||
ArrayList progressPoints = new ArrayList();
|
||
//检测动作过程的点(百分比)
|
||
ArrayList progressCallback = new ArrayList();
|
||
//动作过程的回调
|
||
Hashtable callbackMap = new Hashtable();
|
||
int progressIndex = 0;
|
||
|
||
/// <summary>
|
||
/// Sets the action.
|
||
/// </summary>
|
||
/// <param name="actionValue">Action value.动作对应的value</param>
|
||
/// <param name="callbackInfor">Callback infor. 是一个key:value的键值对
|
||
/// key:是0~100的整数,表示动作播放到百分之多少时执行回调,
|
||
/// 而回调方法就是该key所对应的value
|
||
/// </param>
|
||
|
||
public void doSetActionWithCallback(int actionValue, ArrayList progressCallbackInfor)
|
||
{
|
||
// if (currActionValue == actionValue) {
|
||
// return;
|
||
// }
|
||
//////////////////////////////////////////////////////////////////
|
||
progressPoints.Clear();
|
||
progressCallback.Clear();
|
||
callbackMap.Clear();
|
||
if (progressCallbackInfor != null) {
|
||
int count = progressCallbackInfor.Count;
|
||
for (int i = 0; i < count; i++) {
|
||
if (i % 2 == 0) {
|
||
progressPoints.Add(NumEx.stringToInt(progressCallbackInfor [i].ToString()) / 100.0f);
|
||
} else {
|
||
progressCallback.Add(progressCallbackInfor [i]);
|
||
}
|
||
}
|
||
|
||
progressCallbackInfor.Clear();
|
||
progressCallbackInfor = null;
|
||
}
|
||
//////////////////////////////////////////////////////////////////
|
||
currActionValue = actionValue;
|
||
currAction = (Action)(Enum.ToObject(typeof(Action), actionValue));
|
||
if (!animator.isInitialized) {
|
||
return;
|
||
}
|
||
animator.SetInteger("Action", actionValue);
|
||
if (progressPoints.Count > 0) {
|
||
progressIndex = 0;
|
||
isCheckProgress = true; // place the code after setAction, beacuse in setAction function ,set isCheckProgress = false;
|
||
} else {
|
||
isCheckProgress = false;
|
||
}
|
||
}
|
||
|
||
AnimatorStateInfo currentState;
|
||
int oldMotionTime = 0;
|
||
//old动作播放次数
|
||
int MotionTime = 0;
|
||
//动作播放次数
|
||
bool isCheckProgress = false;
|
||
// object callback = null;
|
||
|
||
void FixedUpdate() //用FixedUpdate是为可以回放
|
||
{
|
||
if (!isCheckProgress)
|
||
return;
|
||
if (animator.layerCount <= 0) {
|
||
return;
|
||
}
|
||
currentState = animator.GetCurrentAnimatorStateInfo(0);
|
||
/*
|
||
* 通过tag来判断当前正在执行状态是否为设置的状态,
|
||
* 因此在创建控制器中要把状态的tag的值与该文件中的ActionValue保持一至
|
||
*/
|
||
if (!currentState.IsTag(currActionValue.ToString())) {
|
||
return;
|
||
}
|
||
if (currentState.loop) {
|
||
isCheckProgress = false;
|
||
// //normalizedTime的整数部分为:该动作循环了几次,小数部分为:该动作的进程
|
||
// MotionTime = (int)(currentState.normalizedTime);
|
||
// if (MotionTime > oldMotionTime) {
|
||
// oldMotionTime = MotionTime;
|
||
// //完成一次动作
|
||
// if (onCompleteMotion != null) {
|
||
// if (typeof(LuaFunction) == onCompleteMotion.GetType()) {
|
||
// ((LuaFunction)onCompleteMotion).Call(this);
|
||
// } else if (typeof(Callback) == onCompleteMotion.GetType()) {
|
||
// ((Callback)onCompleteMotion)(this);
|
||
// }
|
||
// }
|
||
// if (onWillCompleteMotion != null) {
|
||
// isCheckWillFinish = true;
|
||
// }
|
||
// }
|
||
} else {
|
||
while (true) {
|
||
if (progressIndex < progressPoints.Count) {
|
||
if (currentState.normalizedTime + 0.009f > (float)(progressPoints [progressIndex])) {
|
||
StartCoroutine(exeCallback(progressCallback [progressIndex]));
|
||
progressIndex++;
|
||
} else {
|
||
break;
|
||
}
|
||
} else {
|
||
isCheckProgress = false;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
public IEnumerator exeCallback(object cbFunc)
|
||
{
|
||
yield return null;
|
||
if (cbFunc != null) {
|
||
Utl.doCallback(cbFunc, this);
|
||
}
|
||
}
|
||
}
|
||
}
|