从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,延时执行下一个连招(如果没连招则结束)
---- 延时执行,执行连招 -> 链接到一开始的普通攻击(不停循环往复)
就这么简单的实现了一个闭包,达到连续普通攻击
整个代码可以搬到任何地方用,也就算是比较好的封装性,也具备健壮性,和扩展性
这方法可能一般的培训机构也会教,这是实践得出的结论,而且简单的很。(普通的大学反而不会教),值得学习和深思