真Unity3d_分享一个攻击连招的简单实现
Posted avi9111
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了真Unity3d_分享一个攻击连招的简单实现相关的知识,希望对你有一定的参考价值。
从5400公司的源代码里获得灵感,不想独享,分享出来
基本和大公司5400一样,5400公司靠着页游,在2000年最后一波成为大公司。
至今应该还是靠页游赚钱
他们号称2012年开始unity3d开发,这个公开源码也几乎是和2012~2013的游戏源码(发布到Web平台)一样了
修正版II(2019.06.11):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BattleAttackManager :MonoBehaviour
public static BattleAttackManager Instance;
private List<int> preCmds = new List<int>();
void Awake()
Instance = this;
public class SkillInfo
public int Id;
public float cd;
MonoBehaviour owner;
float lastAttackTime;
// 公共cd 为 0.2 秒
public int CommonCD = 500;
int currSkillId;
public BattleAttackManager(MonoBehaviour owner)
this.owner = owner;
public void Init(MonoBehaviour owner)
this.owner = owner;
public void NormalAttack(int skillId =-1)
if (preCmds == null)
preCmds = new List<int> ();
//有连招,并且最后的连招能接上当前skillId
// if (preCmds.Count > 0 && preCmds[preCmds.Count - 1]==skillId-1)
//
// preCmds.Add(skillId);
// return;
//
if (IsComboCooldown())
preCmds.Add(skillId);
return;
//theOwner.motor.TurnToControlStickDir();
//Util.MogoUtils.LookAtTargetInRange(theOwner.Transform, 6, 360);
//(skillManager as PlayerSkillManager).ResetCoolTime(nextskill);
//EntityMyself.preSkillTime = Time.realtimeSinceStartup;
//theOwner.CastSkill(nextskill);
ResetCoolTime(skillId);
int index = skillId % 100;
Debug.Log ("Attack 1 preCmds:" + LogString);
Invoke("NextCmd",1f);
public string LogString
get
string s="";
for (int i = 0; i < preCmds.Count; i++)
s+=preCmds[i] +"-";
return s;
public int GetLastCombo()
if (preCmds.Count == 0)
return 0;
else
return preCmds[preCmds.Count - 1];
public bool IsAttackDone()
return preCmds.Count == 0;
private void ResetCoolTime(int skillId)
currSkillId = skillId;
lastAttackTime = Time.realtimeSinceStartup;
private bool IsComboCooldown()
int attackInterval = (int)((Time.realtimeSinceStartup - lastAttackTime) * 1000);
if (attackInterval < CommonCD)
Debug.Log ("common attack cool down time");
return true;
else
Debug.Log ("cd check=" + attackInterval + "|" + CommonCD);
return false;
public void NextCmd()
if (preCmds.Count == 0)
return;
int skillId = preCmds[0];
preCmds.RemoveAt(0);
NormalAttack(skillId);
测试方法:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GUIButton : MonoBehaviour
void Start()
BattleAttackManager.Instance.Init (this);
void OnGUI()
if (GUILayout.Button ("Attack"))
//Debug.Log ("Atta");
BattleAttackManager.Instance.NormalAttack();
只要随便新建衣蛾Enpty GameObject,把测试脚本和BattleAttackManager脚本挂上即可
这个源码已经能直接复制粘贴用,部分注析,或者自己扩展开发即可
但是基本原理确是杠杠的
5400公司原来的计时器TimerHeap 封装了,源码看的到,没有做反编
我扩展开发,提唤醒用了Invoke 做计时器
但扩展开发整个连招,基本原理也就是基于5400公司的源码:
【开始】
普通攻击 ->有CD则缓存
->没有CD则执行攻击 ->并根据CD,延时执行下一个连招(如果没连招则结束)
---- 延时执行,执行连招 -> 链接到一开始的普通攻击(不停循环往复)
就这么简单的实现了一个闭包,达到连续普通攻击
整个代码可以搬到任何地方用,也就算是比较好的封装性,也具备健壮性,和扩展性
这方法可能一般的培训机构也会教,这是实践得出的结论,而且简单的很。(普通的大学反而不会教),值得学习和深思
以上是关于真Unity3d_分享一个攻击连招的简单实现的主要内容,如果未能解决你的问题,请参考以下文章