2
0
Fork 0

行为树代替蓝图,清除bolt

master
cd 3 years ago
parent d69a45fbb2
commit e0ee592faf

@ -16,11 +16,11 @@ MonoBehaviour:
mIsImporting: 0
mAwaitingModelImport: 0
mAwaitingFragmentsImport: 0
mLastUsedObjectDefinitionHash: C27F1E579B62D080FFFBB5CFDA296742FF59519D947FE9A3D2F24C803E3CC8B5
mLastUsedObjectDefinitionHash: 8496F8225603381CE06541EF2348D1F117E55C65287BF1DD63EBE98E1C5BB7A2
mLastUsedScriptFragmentsHash: 0000000000
mLastUsedPackagesHash: 1177269412
mLastUsedPackagesCount: 1
mLastBuildCode: 1
mLastEditorStartupTimeTicks: 638209644160373835
mLastEditorStartupTimeTicks: 638211469834188930
mNewVersionAvailable: 1
mLastAttachedFlowPlayerValue: 0

@ -20,7 +20,7 @@ namespace Articy.Touhou.GlobalVariables
{
[Articy.Unity.ArticyCodeGenerationHashAttribute(638210740542068464)]
[Articy.Unity.ArticyCodeGenerationHashAttribute(638211665862923300)]
public class ArticyScriptFragments : BaseScriptFragments, ISerializationCallbackReceiver
{

@ -79,6 +79,9 @@ namespace Articy.Touhou.Features
[SerializeField()]
private Int32 mLevelSizeY;
[SerializeField()]
private String mAIRes;
[SerializeField()]
private UInt64 mOwnerId;
@ -345,6 +348,28 @@ namespace Articy.Touhou.Features
}
}
public String Unresolved_AIRes
{
get
{
return mAIRes;
}
}
public String AIRes
{
get
{
return Articy.Unity.ArticyTextExtension.Resolve(this, mAIRes);
}
set
{
var oldValue = mAIRes;
mAIRes = value;
Articy.Unity.ArticyDatabase.ObjectNotifications.ReportChanged(OwnerId, OwnerInstanceId, "Level.AIRes", oldValue, mAIRes);
}
}
public UInt64 OwnerId
{
get
@ -429,6 +454,7 @@ namespace Articy.Touhou.Features
}
newClone.LevelSizeX = LevelSizeX;
newClone.LevelSizeY = LevelSizeY;
newClone.AIRes = Unresolved_AIRes;
newClone.OwnerId = OwnerId;
}
@ -537,6 +563,11 @@ namespace Articy.Touhou.Features
LevelSizeY = System.Convert.ToInt32(aValue);
return;
}
if ((aProperty == "AIRes"))
{
AIRes = System.Convert.ToString(aValue);
return;
}
}
public Articy.Unity.Interfaces.ScriptDataProxy getProp(string aProperty)
@ -613,6 +644,10 @@ namespace Articy.Touhou.Features
{
return new Articy.Unity.Interfaces.ScriptDataProxy(LevelSizeY);
}
if ((aProperty == "AIRes"))
{
return new Articy.Unity.Interfaces.ScriptDataProxy(AIRes);
}
return null;
}
#endregion

@ -63,6 +63,8 @@ namespace Articy.Touhou.Features
private NumberConstraint mLevelSizeY;
private TextConstraint mAIRes;
public TextConstraint Prefab
{
get
@ -225,6 +227,15 @@ namespace Articy.Touhou.Features
}
}
public TextConstraint AIRes
{
get
{
EnsureConstraints();
return mAIRes;
}
}
public virtual void EnsureConstraints()
{
if ((mLoadedConstraints == true))
@ -250,6 +261,7 @@ namespace Articy.Touhou.Features
mDoor = new Articy.Unity.Constraints.ReferenceSlotConstraint("Entity;", "", "None;", "Door;");
mLevelSizeX = new Articy.Unity.Constraints.NumberConstraint(1D, 4D, 0, 0, 0, null);
mLevelSizeY = new Articy.Unity.Constraints.NumberConstraint(1D, 4D, 0, 0, 0, null);
mAIRes = new Articy.Unity.Constraints.TextConstraint(2048, "", null, false, false);
}
}
}

@ -22,7 +22,7 @@ namespace Articy.Touhou
[Serializable()]
[Articy.Unity.ArticyCodeGenerationHashAttribute(638210740408892070)]
[Articy.Unity.ArticyCodeGenerationHashAttribute(638211665690499275)]
public class InputPin : ArticyPrimitive, IInputPin
{

@ -185,6 +185,25 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 4488511c690d7d247bc45f2106962d66, type: 3}
m_Name: ArticyScriptFragments
m_EditorClassIdentifier:
--- !u!114 &-2383945761423504911
MonoBehaviour:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ab8bedcae6c8fc0448f1b9e7bc8c751a, type: 3}
m_Name: DefaultGlobalVariables
m_EditorClassIdentifier:
BoolVariableCache: []
IntVariableCache: []
StringVariableCache: []
LiveBoolVariableCache: []
LiveIntVariableCache: []
LiveStringVariableCache: []
isInitialized: 1
--- !u!114 &-2148810811734425905
MonoBehaviour:
m_ObjectHideFlags: 3
@ -211,6 +230,25 @@ MonoBehaviour:
m_EditorClassIdentifier:
serializedNodes: []
--- !u!114 &-1972018416192658740
MonoBehaviour:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 1655710724, guid: 23cdf4a0ba64c164d8ffb0c744ae259d, type: 3}
m_Name: HierarchyManager
m_EditorClassIdentifier:
serializedNodes:
- id: 72057594037927937
parent: 0
technicalName: Touhou
articyType: Project
childCount: 0
indexOfFirstChild: 1
--- !u!114 &-1639822648299062275
MonoBehaviour:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
@ -305,7 +343,7 @@ MonoBehaviour:
m_Script: {fileID: -1676762633, guid: 23cdf4a0ba64c164d8ffb0c744ae259d, type: 3}
m_Name: ArticyDatabase
m_EditorClassIdentifier:
mHierarchy: {fileID: -6196579516162105744}
mHierarchy: {fileID: -1639822648299062275}
mLocalization: {fileID: -4256971298007036964}
mInternalProject:
mName: touhou
@ -381,8 +419,8 @@ MonoBehaviour:
- "Assets/\u7CBE\u7075\u56FE/\u5B50\u5F39/pt_blue"
- "Assets/\u7CBE\u7075\u56FE/\u5B50\u5F39/pt_red"
- "Assets/\u7CBE\u7075\u56FE/\u4EA4\u4E92\u7269/light1"
mDefaultGlobalVariables: {fileID: 8306414631170675638}
mScriptFragments: {fileID: -6230099005212315861}
mDefaultGlobalVariables: {fileID: -2383945761423504911}
mScriptFragments: {fileID: 6227825354192494019}
mPackages:
- PackageName: gamedata
PackagePath: gamedata
@ -541,6 +579,18 @@ MonoBehaviour:
m_Name: HierarchyManager
m_EditorClassIdentifier:
serializedNodes: []
--- !u!114 &6227825354192494019
MonoBehaviour:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4488511c690d7d247bc45f2106962d66, type: 3}
m_Name: ArticyScriptFragments
m_EditorClassIdentifier:
--- !u!114 &6880224011786664382
MonoBehaviour:
m_ObjectHideFlags: 3

@ -45,5 +45,19 @@ namespace Game
{
_builder.Condition(name, action);
}
protected void ReturnSuccess(Action action)
{
_builder.ReturnSuccess();
action();
_builder.End();
}
protected void ReturnFailure(Action action)
{
_builder.ReturnFailure();
action();
_builder.End();
}
}
}

@ -43,6 +43,21 @@ namespace Game
((IAIEntity)ret.AIObject).Reset(entity);
return ret;
}
public BehaviorTreePoolItem CreateAILevel(string name)
{
if (!_dict.ContainsKey(name))
{
return CreateAILevel("AIDirectorDefault");
}
var ret = Create<BehaviorTreePoolItem>(name, (item) =>
{
item.AIObject = _dict[name]();
item.AIObject.Create();
});
return ret;
}
}
public class BehaviorTreePoolItem : ObjectPoolItemBase

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using CleverCrow.Fluid.BTs.Trees;
using UnityEngine;
using UnityEngine.Timeline;
namespace Game
{
public interface IAIDirector
{
void Reset();
}
public partial class AIDirectorBase<T> : AIObjectBase<T>, IAIDirector where T : new()
{
private float _tickTime;
private float _attackRoundTime;
private float _attackWaitTime;
private int _attackTimes;
private readonly Queue<int> _allEnemies = new Queue<int>();
public void Reset()
{
_tree.Reset();
_tickTime = 0;
ResetAttack();
}
private void ResetAttack()
{
_attackRoundTime = 0;
_attackWaitTime = 0;
_attackTimes = 0;
}
}
}

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: eb5c101493584922816297987f556350
timeCreated: 1685469823

@ -0,0 +1,14 @@
namespace Game
{
public class AIDirectorDefault : AIDirectorBase<AIDirectorDefault>
{
protected override void OnCreate()
{
Selector(() =>
{
UpdateModule();
UpdateAttack();
});
}
}
}

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 0aaa578068984fb0894cc094a2f951e8
timeCreated: 1685469893

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 90bc9dc235f347d390a7fe8a07a91e81
timeCreated: 1685536217

@ -0,0 +1,155 @@
using UnityEngine;
namespace Game
{
public partial class AIDirectorBase<T> where T : new()
{
protected void UpdateModule()
{
Sequence(() =>
{
_checkTick();
_updateMonster();
_updateMonsterModule(EAIModuleType.Melee);
_updateMonsterModule(EAIModuleType.LongRange);
_updateMonsterModule(EAIModuleType.Spectator);
});
}
protected void UpdateAttack()
{
Sequence(() =>
{
Sequence(() =>
{
_checkAttackRound();
_checkAttackFrequency();
_checkAttackTimes();
_attack();
});
_resetAttack();
});
}
private void _checkAttackRound()
{
Do("检查攻击间隔", () =>
{
var curWave = Util.GetCurWave();
if (_attackRoundTime < curWave.GetAttackRound())
{
_attackRoundTime += Time.deltaTime;
return ETaskStatus.Failure;
}
return ETaskStatus.Success;
});
}
private void _checkAttackFrequency()
{
Do("检查攻击频率", () =>
{
var curWave = Util.GetCurWave();
if (_attackWaitTime < curWave.GetAttackFrequency())
{
_attackWaitTime += Time.deltaTime;
return ETaskStatus.Failure;
}
return ETaskStatus.Success;
});
}
private void _checkAttackTimes()
{
Do("检查攻击次数", () =>
{
var curWave = Util.GetCurWave();
return _attackTimes >= curWave.GetAttackTimes() ? ETaskStatus.Failure : ETaskStatus.Success;
});
}
private void _resetAttack()
{
Do("重置攻击计数", () =>
{
ResetAttack();
return ETaskStatus.Success;
});
}
private void _attack()
{
Sequence(() =>
{
_updateMonster();
Do("分配攻击权限", () =>
{
var isSet = false;
while (_allEnemies.Count > 0)
{
var enemy = _allEnemies.Dequeue();
if (!Util.GetHungryFull(enemy)) continue;
Util.SetAttackPermit(enemy, true);
isSet = true;
break;
}
if (!isSet) return ETaskStatus.Failure;
_attackTimes++;
_attackWaitTime = 0;
return ETaskStatus.Success;
});
});
}
private void _checkTick()
{
Do("检查更新CD", () =>
{
_tickTime -= Time.deltaTime;
if (_tickTime > 0) return ETaskStatus.Failure;
_tickTime = GameConst.AIDirectorTick;
return ETaskStatus.Success;
});
}
private void _updateMonster()
{
Do("更新敌人信息", () =>
{
var master = Util.GetMaster().ID();
var allEnemies = Util.GetAllEnemies();
allEnemies.Sort((left, right) =>
(int)((Util.EntityDistance(master, left) - Util.EntityDistance(master, right)) * 10));
foreach (var enemy in allEnemies)
{
_allEnemies.Enqueue(enemy);
}
return ETaskStatus.Success;
});
}
private void _updateMonsterModule(EAIModuleType type)
{
Do("${type}", () =>
{
if (_allEnemies.Count == 0)
return ETaskStatus.Failure;
var curWave = Util.GetCurWave();
for (var i = 0; i < curWave.GetModuleNum(type); i++)
{
if (_allEnemies.Count == 0)
break;
var entity = _allEnemies.Dequeue();
Util.SetAIModuleType(entity, type);
}
return ETaskStatus.Success;
});
}
}
}

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2a69fa0ae74e4f97a550bc5f1533127c
timeCreated: 1685536240

@ -18,6 +18,7 @@ namespace Game
public void Reset(GameEntity entity)
{
_entity = entity;
_tree.Reset();
}
}
}

@ -6,6 +6,7 @@
{
Sequence(() =>
{
SetHungry();
CheckStagger();
FindTarget();
Selector(() =>
@ -17,6 +18,16 @@
});
}
private void SetHungry()
{
Selector("设置饥饿值", () =>
{
SetHungryIncrease(EAIModuleType.LongRange, 1, 1);
SetHungryIncrease(EAIModuleType.Melee, 1, 1);
SetHungryIncrease(EAIModuleType.Spectator, 1, 1);
});
}
private void CaseLongRange()
{
Sequence("远程", () =>

@ -1,6 +1,6 @@
namespace Game
{
public partial class AIEntityBase<T> : AIObjectBase<T> where T : new()
public partial class AIEntityBase<T> where T : new()
{
protected void FindTarget()
{
@ -35,38 +35,17 @@
});
}
protected void CastSkill(int index, bool needPermit)
protected void SetHungryIncrease(EAIModuleType moduleType, float value,float rate)
{
Sequence(($"释放技能[{index}],{needPermit}"), () =>
Do($"{moduleType}[{value}](*{rate})", () =>
{
if (needPermit) _checkAttackPermit();
_stop();
_castSkill(index);
if (needPermit) _resetAttackPermit();
});
}
private void _castSkill(int index)
{
Do($"释放技能[{index}]", () =>
{
var target = Util.GetEntity(_entity.Target());
var dir = target.Pos() - _entity.Pos();
Util.CastSkillMonster(_entity, index, dir);
return ETaskStatus.Success;
});
}
private void _checkAttackPermit()
{
Condition("检查攻击权限", () => _entity.aI.AttackPermit.Value);
}
if (_entity.aI.ModuleType.Value != moduleType)
{
return ETaskStatus.Failure;
}
private void _resetAttackPermit()
{
Do("重置攻击权限", () =>
{
_entity.aI.AttackPermit.Value = false;
_entity.aI.HungryIncrease = value;
_entity.aI.HungryIncreaseRate = rate;
return ETaskStatus.Success;
});
}

@ -1,6 +1,6 @@
namespace Game
{
public partial class AIEntityBase<T> : AIObjectBase<T> where T : new()
public partial class AIEntityBase<T> where T : new()
{
protected void MoveTo()
{

@ -0,0 +1,41 @@
namespace Game
{
public partial class AIEntityBase<T> where T : new()
{
protected void CastSkill(int index, bool needPermit)
{
Sequence(($"释放技能[{index}],{needPermit}"), () =>
{
if (needPermit) _checkAttackPermit();
_stop();
_castSkill(index);
if (needPermit) _resetAttackPermit();
});
}
private void _castSkill(int index)
{
Do($"释放技能[{index}]", () =>
{
var target = Util.GetEntity(_entity.Target());
var dir = target.Pos() - _entity.Pos();
Util.CastSkillMonster(_entity, index, dir);
return ETaskStatus.Success;
});
}
private void _checkAttackPermit()
{
Condition("检查攻击权限", () => _entity.aI.AttackPermit.Value);
}
private void _resetAttackPermit()
{
Do("重置攻击权限", () =>
{
_entity.aI.AttackPermit.Value = false;
return ETaskStatus.Success;
});
}
}
}

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 46b3a72814cc4bb5a450f2ab8e30fa50
timeCreated: 1685536094

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: d8599277a108fc243b3a74461dab1295
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: c09975d219157c94386c2356b8fadcad
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1,124 +0,0 @@
using UnityEngine;
using Bolt;
namespace Game
{
[UnitTitle("设置目标")]
[UnitSubtitle("NodeSetTarget")]
[UnitCategory("Game-AI")]
public class NodeSetTarget : NodeDefault
{
public ValueInput target;
protected override void Def()
{
target = ValueInput<int>("target");
}
protected override void Run(Flow flow)
{
var e = data.Entity;
var t = flow.GetValue<int>(target);
Util.GetEntity(e).SetTarget(t);
}
}
[UnitTitle("获取难度等级")]
[UnitSubtitle("NodeGetDifficulty")]
[UnitCategory("Game-AI")]
public class NodeGetDifficulty : NodeDefault
{
public ValueOutput difficulty;
protected override void Def()
{
difficulty = ValueOutput<int>("difficulty");
}
protected override void Run(Flow flow)
{
var d = Util.GetDifficulty();
flow.SetValue(difficulty, d);
}
}
[UnitTitle("设置思考频率")]
[UnitSubtitle("NodeSetThinkCD")]
[UnitCategory("Game-AI")]
public class NodeSetThinkCD : NodeDefault
{
public ValueInput cd;
protected override void Def()
{
cd = ValueInput<float>("cd", 1);
}
protected override void Run(Flow flow)
{
var e = data.Entity;
var t = flow.GetValue<float>(cd);
Util.SetThinkCd(e, t);
}
}
[UnitTitle("设置饥饿值基础配置")]
[UnitSubtitle("NodeHungryBasic")]
[UnitCategory("Game-AI")]
public class NodeHungryBasic : NodeDefault
{
public ValueInput max;
public ValueInput now;
public ValueInput inc;
protected override void Def()
{
max = ValueInput<float>("max", 1);
now = ValueInput<float>("now", 0);
inc = ValueInput<float>("inc", 0);
}
protected override void Run(Flow flow)
{
var e = data.Entity;
var m = flow.GetValue<float>(max);
var n = flow.GetValue<float>(now);
var i = flow.GetValue<float>(inc);
Util.SetHungryBasic(e, m, n, i);
}
}
[UnitTitle("设置饥饿值自增倍率")]
[UnitSubtitle("NodeHungryIncreaseRate")]
[UnitCategory("Game-AI")]
public class NodeHungryIncreaseRate : NodeDefault
{
public ValueInput rate;
protected override void Def()
{
rate = ValueInput<float>("rate", 0);
}
protected override void Run(Flow flow)
{
var e = data.Entity;
var r = flow.GetValue<float>(rate);
Util.SetHungryIncreaseRate(e, r);
}
}
[UnitTitle("释放技能")]
[UnitSubtitle("NodeCastSkill")]
[UnitCategory("Game-AI")]
public class NodeCastSkill : NodeDefault
{
public ValueInput skill;
public ValueInput dir;
protected override void Def()
{
skill = ValueInput<int>("skill", 0);
dir = ValueInput<Vector3>("dir");
}
protected override void Run(Flow flow)
{
var e = data.Entity;
var s = flow.GetValue<int>(skill);
var d = flow.GetValue<Vector3>(dir);
var ett = Util.GetEntity(e);
if (ett == null)
{
return;
}
Util.CastSkillMonster(Util.GetEntity(e), s, d);
}
}
}

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 6f4dbb4915d65b842b1998aaab328d12
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -1,120 +0,0 @@
using Bolt;
namespace Game
{
[UnitTitle("设置模块类型")]
[UnitSubtitle("NodeSetModuleType")]
[UnitCategory("Game-AIDirector")]
public class NodeSetModuleType : NodeDefault
{
public ValueInput entity;
public ValueInput type;
protected override void Def()
{
entity = ValueInput<int>("entity");
type = ValueInput<EAIModuleType>("type", EAIModuleType.Spectator);
}
protected override void Run(Flow flow)
{
var e = flow.GetValue<int>(entity);
var t = flow.GetValue<EAIModuleType>(type);
Util.SetAIModuleType(e, t);
}
}
[UnitTitle("获取模块类型")]
[UnitSubtitle("NodeGetModuleType")]
[UnitCategory("Game-AIDirector")]
public class NodeGetModuleType : NodeDefault
{
public ValueInput entity;
public ValueOutput type;
protected override void Def()
{
entity = ValueInput<int>("entity");
type = ValueOutput<EAIModuleType>("type");
}
protected override void Run(Flow flow)
{
var e = flow.GetValue<int>(entity);
var t = Util.GetAIModuleType(e);
flow.SetValue(type, t);
}
}
[UnitTitle("获取模块数量")]
[UnitSubtitle("NodeGetModuleNum")]
[UnitCategory("Game-AIDirector")]
public class NodeGetModuleNum : NodeDefault
{
public ValueInput type;
public ValueOutput num;
protected override void Def()
{
type = ValueInput<EAIModuleType>("type", EAIModuleType.Spectator);
num = ValueOutput<int>("num");
}
protected override void Run(Flow flow)
{
var t = flow.GetValue<EAIModuleType>(type);
var n = Util.GetModuleNum(t);
flow.SetValue(num, n);
}
}
[UnitTitle("设置攻击权限")]
[UnitSubtitle("NodeSetAttackPermit")]
[UnitCategory("Game-AIDirector")]
public class NodeSetAttackPermit : NodeDefault
{
public ValueInput entity;
public ValueInput value;
protected override void Def()
{
entity = ValueInput<int>("entity");
value = ValueInput<bool>("value", false);
}
protected override void Run(Flow flow)
{
var e = flow.GetValue<int>(entity);
var v = flow.GetValue<bool>(value);
Util.SetAttackPermit(e, v);
}
}
[UnitTitle("获取攻击权限")]
[UnitSubtitle("NodeGetAttackPermit")]
[UnitCategory("Game-AIDirector")]
public class NodeGetAttackPermit : NodeDefault
{
public ValueInput entity;
public ValueOutput ok;
protected override void Def()
{
entity = ValueInput<int>("entity");
ok = ValueOutput<bool>("ok");
}
protected override void Run(Flow flow)
{
var e = flow.GetValue<int>(entity);
var o = Util.GetAttackPermit(e);
flow.SetValue(ok, o);
}
}
[UnitTitle("饥饿值是否已满")]
[UnitSubtitle("NodeGetHungryFull")]
[UnitCategory("Game-AIDirector")]
public class NodeGetHungryFull : NodeDefault
{
public ValueInput entity;
public ValueOutput ok;
protected override void Def()
{
entity = ValueInput<int>("entity");
ok = ValueOutput<bool>("ok");
}
protected override void Run(Flow flow)
{
var e = flow.GetValue<int>(entity);
var o = Util.GetHungryFull(e);
flow.SetValue(ok, o);
}
}
}

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 2716ab62449c9b6478ed0a7476b937da
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -1,90 +0,0 @@
using UnityEngine;
using Bolt;
/// <summary>
/// 蓝图管理器
/// 蓝图分为两种,不用保存中间状态的直接执行,执行后销毁入池;需要保存状态的返回对象,由创建者销毁入池
/// </summary>
namespace Game
{
public enum EBpState
{
Enter,
Update,
Leave,
}
public class BlueprintBasicData
{
public int Entity;
public int Target;
public int Owner;
}
public class BlueprintPoolItem : ObjectPoolItemBase
{
public GameObject m_GameObject;
public FlowMachine m_FlowMachine;
public VariableDeclarations m_Variables;
protected override void OnCreate()
{
base.OnCreate();
}
protected override void OnDestroy()
{
base.OnDestroy();
}
}
public class BlueprintPoolManager : ObjectPoolBase<BlueprintPoolManager>
{
private readonly string m_BlueprintPath = "Blueprint/";
private BlueprintBasicData m_DefaultBlueprintBasicData = new BlueprintBasicData();
public void Run(string name, string trigger, BlueprintBasicData data)
{
var bp = CreateBlueprint(name);
SetData(bp, data);
bp.m_FlowMachine.TriggerUnityEvent(trigger);
bp.Destroy();
}
private void SetData(BlueprintPoolItem bpItem, BlueprintBasicData data)
{
if (data == null)
{
data = m_DefaultBlueprintBasicData;
}
var obj = bpItem.m_Variables;
obj.Set("entity", data.Entity);
obj.Set("target", data.Target);
obj.Set("owner", data.Owner);
obj.Set("data", data);
}
private BlueprintPoolItem CreateBlueprint(string name)
{
var bpNew = Create<BlueprintPoolItem>(name, (item) =>
{
var go = new GameObject(name);
var flowMacro = EnsureGetBulletFlowMacro(name);
var flowMachine = go.AddComponent<FlowMachine>();
flowMachine.nest.SwitchToMacro(flowMacro);
item.m_FlowMachine = flowMachine;
item.m_Variables = Variables.Object(go);
go.transform.SetParent(BlueprintPoolManager.Instance.Root.transform);
item.m_GameObject = go;
});
return bpNew;
}
private FlowMacro EnsureGetBulletFlowMacro(string path)
{
var pathReal = $"{m_BlueprintPath}{path}";
return Util.Load<FlowMacro>(pathReal);
}
}
public abstract partial class Util
{
public static void RunBp(string name, string trigger)
{
BlueprintPoolManager.Instance.Run(name, trigger, null);
}
}
}

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: bed465de634e5274bb85435edf717459
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 9989848984d77204bb8dece4da2402f0
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1,52 +0,0 @@
using Bolt;
namespace Game
{
[UnitTitle("创建Buff")]
[UnitSubtitle("NodeAddBuff")]
[UnitCategory("Game-Buff")]
public class NodeAddBuff : NodeDefault
{
public ValueInput entity;
public ValueInput owner;
public ValueInput buffId;
public ValueInput timeS;
public ValueInput isCover;
protected override void Def()
{
entity = ValueInput<int>("entity");
owner = ValueInput<int>("owner");
buffId = ValueInput<string>("buffId");
timeS = ValueInput<float>("timeS");
isCover = ValueInput<bool>("isCover");
}
protected override void Run(Flow flow)
{
var e = flow.GetValue<int>(entity);
var o = flow.GetValue<int>(owner);
var b = flow.GetValue<string>(buffId);
var t = flow.GetValue<float>(timeS);
var c = flow.GetValue<bool>(isCover);
Util.AddBuff(e, o, b, t);
}
}
[UnitTitle("硬直计数")]
[UnitSubtitle("NodeEntityStun")]
[UnitCategory("Game-Buff")]
public class NodeEntityStun : NodeDefault
{
public ValueInput entity;
public ValueInput count;
protected override void Def()
{
entity = ValueInput<int>("entity");
count = ValueInput<int>("count");
}
protected override void Run(Flow flow)
{
var e = flow.GetValue<int>(entity);
var c = flow.GetValue<int>(count);
Util.AddStunCount(e, c);
}
}
}

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 8c4433931642e3943a8c73538f8a4375
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 119955de947ceca4fb32891023a3db14
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 7a237841034b1f54080525444520ed39
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: cce4361e849d30a4dbeafc3c443a01be
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 47eb993fd915b834b80dd6503c9dac93
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1,49 +0,0 @@
using System.Collections.Generic;
using Bolt;
namespace Game
{
/// <summary>
/// Node基类 项目内所有节点继承自该类
/// 有一个ControlInput的默认节点
/// </summary>
public class NodeBase : Unit
{
public ControlInput input { get; protected set; }
protected BlueprintBasicData data;
protected List<int> tempListInt = new List<int>();
protected override void Definition()
{
input = ControlInput("", Enter);
OnDefinition();
}
private ControlOutput Enter(Flow flow)
{
data = Variables.Object(flow.stack.gameObject).Get<BlueprintBasicData>("data");
return OnEnter(flow);
}
protected virtual void OnDefinition() { }
protected virtual ControlOutput OnEnter(Flow flow) { return null; }
}
/// <summary>
/// 有一个ControlInput和一个ControlOutput的默认节点
/// </summary>
public class NodeDefault : NodeBase
{
public ControlOutput output { get; protected set; }
protected override void OnDefinition()
{
output = ControlOutput("");
Def();
}
protected override ControlOutput OnEnter(Flow flow)
{
Run(flow);
return output;
}
protected virtual void Def() { }
protected virtual void Run(Flow flow) { }
}
}

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: a54981af9ca246d419e724a75b4050b2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -1,183 +0,0 @@
using System.Collections.Generic;
using UnityEngine;
using Bolt;
namespace Game
{
[UnitTitle("测试打印")]
[UnitSubtitle("NodeDebugLog")]
[UnitCategory("Game-Common")]
public class NodeDebugLog : NodeDefault
{
public ValueInput log { get; private set; }
protected override void Def()
{
log = ValueInput<object>("log");
}
protected override void Run(Flow flow)
{
Util.Print(flow.GetValue<object>(log));
}
}
[UnitTitle("射线检测(1->2)")]
[UnitSubtitle("NodeRayCast")]
[UnitCategory("Game-Common")]
public class NodeRayCast : NodeDefault
{
public ValueInput pos1;
public ValueInput pos2;
public ValueOutput target;
protected override void Def()
{
pos1 = ValueInput<Vector3>("p1");
pos2 = ValueInput<Vector3>("p2");
target = ValueOutput<List<int>>("target");
}
protected override void Run(Flow flow)
{
var entity = Util.GetEntity(data.Entity);
var p1 = flow.GetValue<Vector3>(pos1);
var p2 = flow.GetValue<Vector3>(pos2);
var dir = p2 - p1;
tempListInt.Clear();
if (dir.magnitude != 0)
{
var hitInfos = Physics.RaycastAll(p1, dir, dir.magnitude, layerMask: UtilPhysics.LayerMaskHit);
foreach (var hitInfo in hitInfos)
{
var hitGo = hitInfo.transform.gameObject;
var hitEntityId = 0;
EntityInfo info;
if (hitGo.TryGetComponent<EntityInfo>(out info))
{
hitEntityId = info.entityId;
if (Util.GetEntity(hitEntityId).Team() == entity.Team())
{
continue;
}
tempListInt.Add(hitEntityId);
}
}
}
flow.SetValue(target, tempListInt);
}
}
[UnitTitle("Box检测(1->2)")]
[UnitSubtitle("NodeBoxCast")]
[UnitCategory("Game-Common")]
public class NodeBoxCast : NodeDefault
{
public ValueInput pos1;
public ValueInput pos2;
public ValueInput width;
public ValueInput height;
public ValueOutput target;
protected override void Def()
{
pos1 = ValueInput<Vector3>("p1");
pos2 = ValueInput<Vector3>("p2");
width = ValueInput<float>("width");
height = ValueInput<float>("height");
target = ValueOutput<List<int>>("target");
}
protected override void Run(Flow flow)
{
var entity = Util.GetEntity(data.Entity);
var p1 = flow.GetValue<Vector3>(pos1);
var p2 = flow.GetValue<Vector3>(pos2);
var w = flow.GetValue<float>(width);
var h = flow.GetValue<float>(height);
var dir = p2 - p1;
tempListInt.Clear();
if (dir.magnitude != 0)
{
var center = (p2 + p1) / 2;
var halfExtents = new Vector3(w / 2, h / 2, dir.magnitude);
var rot = Quaternion.FromToRotation(Vector3.right, dir);
var hitInfos = Physics.BoxCastAll(center, halfExtents, dir, rot, 0, layerMask: UtilPhysics.LayerMaskHit);
Util.DrawBox(center, halfExtents, dir, Color.green);
foreach (var hitInfo in hitInfos)
{
var hitGo = hitInfo.transform.gameObject;
var hitEntityId = 0;
EntityInfo info;
if (hitGo.TryGetComponent<EntityInfo>(out info))
{
hitEntityId = info.entityId;
if (Util.GetEntity(hitEntityId).Team() == entity.Team())
{
continue;
}
tempListInt.Add(hitEntityId);
}
}
}
flow.SetValue(target, tempListInt);
}
}
// [UnitTitle("造成伤害")]
// [UnitSubtitle("NodeDamage")]
// [UnitCategory("Game-Common")]
// public class NodeDamage : NodeDefault
// {
// public ValueInput target;
// public ValueInput damageRate;
// public ValueInput hitDir;
// public ValueInput isFlow;
// public ValueInput hitId;
// public ValueInput isSkill;
// public ValueInput performance;
// protected override void Def()
// {
// target = ValueInput<int>("entity");
// damageRate = ValueInput<float>("damageRate");
// hitDir = ValueInput<Vector3>("hitDir");
// isFlow = ValueInput<bool>("isFlow");
// hitId = ValueInput<int>("hitId");
// isSkill = ValueInput<bool>("isSkill");
// performance = ValueInput<ESKillPerformance>("performance");
// }
// protected override void Run(Flow flow)
// {
// var t = flow.GetValue<int>(target);
// var d = flow.GetValue<float>(damageRate);
// var hd = flow.GetValue<Vector3>(hitDir);
// var ifw = flow.GetValue<bool>(isFlow);
// var hid = flow.GetValue<int>(hitId);
// var s = flow.GetValue<bool>(isSkill);
// var p = flow.GetValue<ESKillPerformance>(performance);
// var hitKey = new Tuple<int, int>(t, hid);
// var owner = Util.GetEntity(data.owner);
// var targetEntity = Util.GetEntity(t);
// var hitInfo = new SkillHitInfo()
// {
// skillParam = new AttackBehaviour()
// {
// isFlow = ifw,
// damageRate = d,
// hitId = hid,
// },
// ownerEntity = owner.ID(),
// hitEntity = t,
// hitPos = targetEntity.Pos(),
// hitDir = hd,
// isRight = true,
// isDealed = false,
// isSkill = s,
// performance = (uint)p,
// };
// if (s)
// {
// if (!owner.skill.skillHitInfo.ContainsKey(hitKey))
// {
// owner.skill.skillHitInfo[hitKey] = hitInfo;
// }
// }
// else
// {
// owner.skill.hitInfo.Add(hitInfo);
// }
// }
}

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: bd6d2e0ad46c4b34f8325b9b0053bb60
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -1,189 +0,0 @@
using System.Collections.Generic;
using UnityEngine;
using Bolt;
namespace Game
{
[UnitTitle("删除实体")]
[UnitSubtitle("NodeDestroyEntity")]
[UnitCategory("Game-Entity")]
public class NodeDestroyEntity : NodeDefault
{
public ValueInput entity;
protected override void Def()
{
entity = ValueInput<int>("entity");
}
protected override void Run(Flow flow)
{
Util.DestroyEntity(flow.GetValue<int>(entity));
}
}
[UnitTitle("实体位置")]
[UnitSubtitle("NodeEntityPosition")]
[UnitCategory("Game-Entity")]
public class NodeEntityPosition : NodeDefault
{
public ValueInput entity;
public ValueOutput pos;
protected override void Def()
{
entity = ValueInput<int>("entity");
pos = ValueOutput<Vector3>("pos");
}
protected override void Run(Flow flow)
{
var e = flow.GetValue<int>(entity);
var p = Util.EntityLogicPos(e);
flow.SetValue(pos, p);
}
}
[UnitTitle("实体距离")]
[UnitSubtitle("NodeEntityDistance")]
[UnitCategory("Game-Entity")]
public class NodeEntityDistance : NodeDefault
{
public ValueInput entity1;
public ValueInput entity2;
public ValueOutput distance;
protected override void Def()
{
entity1 = ValueInput<int>("entity1");
entity2 = ValueInput<int>("entity2");
distance = ValueOutput<float>("distance");
}
protected override void Run(Flow flow)
{
var e1 = flow.GetValue<int>(entity1);
var e2 = flow.GetValue<int>(entity2);
var dist = Util.EntityDistance(e1, e2);
flow.SetValue(distance, dist);
}
}
[UnitTitle("实体偏移向量(1->2)")]
[UnitSubtitle("NodeEntityOffset")]
[UnitCategory("Game-Entity")]
public class NodeEntityOffset : NodeDefault
{
public ValueInput entity1;
public ValueInput entity2;
public ValueOutput offset;
protected override void Def()
{
entity1 = ValueInput<int>("entity1");
entity2 = ValueInput<int>("entity2");
offset = ValueOutput<Vector3>("offset");
}
protected override void Run(Flow flow)
{
var e1 = flow.GetValue<int>(entity1);
var e2 = flow.GetValue<int>(entity2);
var dist = Util.EntityOffset(e1, e2);
flow.SetValue(offset, dist);
}
}
[UnitTitle("实体是否浮空")]
[UnitSubtitle("NodeEntityInAir")]
[UnitCategory("Game-Entity")]
public class NodeEntityInAir : NodeDefault
{
public ValueInput entity;
public ValueOutput inAir;
protected override void Def()
{
entity = ValueInput<int>("entity");
inAir = ValueOutput<bool>("inAir");
}
protected override void Run(Flow flow)
{
var e = flow.GetValue<int>(entity);
var b = Util.EntityInAir(e);
flow.SetValue(inAir, b);
}
}
[UnitTitle("移动")]
[UnitSubtitle("NodeEntityMove")]
[UnitCategory("Game-Entity")]
public class NodeEntityMove : NodeDefault
{
public ValueInput direction { get; private set; }
protected override void Def()
{
direction = ValueInput<Vector3>("direction");
}
protected override void Run(Flow flow)
{
var e = data.Entity;
var d = flow.GetValue<Vector3>(direction);
d = new Vector3(d.x, 0, d.z);
Util.EntityMove(e, d);
}
}
[UnitTitle("停止移动")]
[UnitSubtitle("NodeEntityStop")]
[UnitCategory("Game-Entity")]
public class NodeEntityStop : NodeDefault
{
protected override void Run(Flow flow)
{
var e = data.Entity;
Util.EntityStopMove(e);
}
}
[UnitTitle("获取主角")]
[UnitSubtitle("NodeGetMaster")]
[UnitCategory("Game-Entity")]
public class NodeGetMaster : NodeDefault
{
public ValueOutput master { get; private set; }
protected override void Def()
{
master = ValueOutput<int>("master");
}
protected override void Run(Flow flow)
{
flow.SetValue(master, Util.GetMasterID());
}
}
[UnitTitle("获取所有敌人")]
[UnitSubtitle("NodeGetAllEnemies")]
[UnitCategory("Game-Entity")]
public class NodeGetAllEnemies : NodeDefault
{
public ValueOutput list { get; private set; }
protected override void Def()
{
list = ValueOutput<List<int>>("list");
}
protected override void Run(Flow flow)
{
flow.SetValue(list, Util.GetAllEnemies());
}
}
[UnitTitle("按照实体距离排序")]
[UnitSubtitle("NodeSortByDistance")]
[UnitCategory("Game-Entity")]
public class NodeSortByDistance : NodeDefault
{
public ValueInput entity { get; private set; }
public ValueInput list { get; private set; }
public ValueOutput result { get; private set; }
protected override void Def()
{
entity = ValueInput<int>("entity");
list = ValueInput<List<int>>("list");
result = ValueOutput<List<int>>("list");
}
protected override void Run(Flow flow)
{
var e = flow.GetValue<int>(entity);
var l = flow.GetValue<List<int>>(list);
l.Sort((left, right) =>
{
return (int)((Util.EntityDistance(e, left) - Util.EntityDistance(e, right)) * 10);
});
flow.SetValue(result, l);
}
}
}

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: a698105e561f6f745b77b57961a09e27
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -1,158 +0,0 @@
using System.Collections.Generic;
using Bolt;
namespace Game
{
[UnitTitle("空")]
[UnitSubtitle("NodeEmpty")]
[UnitCategory("Game-Logic")]
public class NodeEmpty : NodeDefault
{ }
[UnitTitle("布尔判断")]
[UnitSubtitle("NodeIf")]
[UnitCategory("Game-Logic")]
public class NodeIf : Unit
{
public ControlInput input;
public ControlOutput outputTrue;
public ControlOutput outputFalse;
public ValueInput condition;
protected override void Definition()
{
input = ControlInput("in", Enter);
outputTrue = ControlOutput("True");
outputFalse = ControlOutput("False");
condition = ValueInput<bool>("condition");
}
public ControlOutput Enter(Flow flow)
{
if (flow.GetValue<bool>(condition))
return outputTrue;
else
{
return outputFalse;
}
}
}
[UnitTitle("随机检测[0-1]")]
[UnitSubtitle("NodeIf")]
[UnitCategory("Game-Logic")]
public class NodeRandomCheck : Unit
{
public ControlInput input;
public ControlOutput outputTrue;
public ControlOutput outputFalse;
public ValueInput condition;
protected override void Definition()
{
input = ControlInput("in", Enter);
outputTrue = ControlOutput("True");
outputFalse = ControlOutput("False");
condition = ValueInput<float>("condition", 0);
}
public ControlOutput Enter(Flow flow)
{
if (GameRandom.Roll(flow.GetValue<float>(condition)))
{
return outputTrue;
}
else
{
return outputFalse;
}
}
}
[UnitTitle("实体排序")]
[UnitSubtitle("NodeSort")]
[UnitCategory("Game-Logic")]
public class NodeSort : Unit
{
public ControlInput input; //初始进入
public ControlOutput output; //最终退出
public ControlInput loop; //循环入口
public ControlOutput comp; //循环出口
public ValueInput list;
public ValueInput compResult;
public ValueOutput result;
public ValueOutput left;
public ValueOutput right;
private List<int> entityList;
private int tempI;
private int tempJ;
protected override void Definition()
{
input = ControlInput("in", Enter);
output = ControlOutput("out");
loop = ControlInput("loop", Loop);
comp = ControlOutput("comp");
list = ValueInput<List<int>>("list");
compResult = ValueInput<int>("compResult");
result = ValueOutput<List<int>>("result");
left = ValueOutput<int>("left");
right = ValueOutput<int>("right");
}
public ControlOutput Enter(Flow flow)
{
entityList = flow.GetValue<List<int>>(list);
tempI = 0;
tempJ = 0;
return comp;
}
public ControlOutput Loop(Flow flow)
{
tempJ++;
if (tempJ >= entityList.Count)
{
tempI++;
if (tempI >= entityList.Count)
{
flow.SetValue(result, entityList);
return output;
}
tempJ = tempI;
return comp;
}
var compValue = flow.GetValue<int>(compResult);
if (compValue > 0)
{
Swap();
}
flow.SetValue(left, entityList[tempI]);
flow.SetValue(right, entityList[tempJ]);
return comp;
}
public void Swap()
{
var temp = entityList[tempI];
entityList[tempI] = entityList[tempJ];
entityList[tempJ] = temp;
}
}
[UnitTitle("列表内容交换")]
[UnitSubtitle("NodeSwap")]
[UnitCategory("Game-Logic")]
public class NodeSwap : NodeDefault
{
public ValueInput list;
public ValueInput indexI;
public ValueInput indexJ;
protected override void Def()
{
list = ValueInput<List<int>>("list");
indexI = ValueInput<int>("indexI");
indexJ = ValueInput<int>("indexJ");
}
protected override void Run(Flow flow)
{
var l = flow.GetValue<List<int>>(list);
var i = flow.GetValue<int>(indexI);
var j = flow.GetValue<int>(indexJ);
var temp = l[i];
l[i] = l[j];
l[j] = temp;
}
}
}

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: d2b8f98537dba704598581fc81e641da
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -1,41 +0,0 @@
using UnityEngine;
using Bolt;
namespace Game
{
[UnitTitle("随机角度")]
[UnitSubtitle("NodeRandVector")]
[UnitCategory("Game-Math")]
public class NodeRandVector : NodeDefault
{
public ValueInput vector { get; private set; }
public ValueInput rot { get; private set; }
public ValueInput forbidRot { get; private set; }
public ValueOutput vectorNew { get; private set; }
protected override void Def()
{
vector = ValueInput<Vector3>("vector");
rot = ValueInput<float>("rot");
forbidRot = ValueInput<float>("forbidRot");
vectorNew = ValueOutput<Vector3>("vectorNew");
}
protected override void Run(Flow flow)
{
var rotHalf = flow.GetValue<float>(rot) * 0.5f;
var forbidRotHalf = flow.GetValue<float>(forbidRot) * 0.5f;
var v = flow.GetValue<Vector3>(vector);
var vNew = v;
if (rotHalf != 0)
{
if (rotHalf <= forbidRotHalf)
{
forbidRotHalf = 0;
}
var rotAdd = GameRandom.Random(forbidRotHalf, rotHalf) * GameRandom.RollSymbol(0.5f);
vNew = Quaternion.AngleAxis(rotAdd, Vector3.up) * v;
}
flow.SetValue(vectorNew, vNew);
}
}
}

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 8834f3f6fac20f5479763f999c67f6b8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -9,7 +9,7 @@ using Articy.Touhou.Templates;
public class BuffData
{
public string BuffId;
public EBpState State;
public EState State;
public BuffTemplate BuffCfg;
public float TimeMax;
public float TimePast;
@ -59,7 +59,7 @@ namespace Game
buff.BuffMap[buffId] = new BuffData
{
BuffId = buffCfgData.TechnicalName,
State = EBpState.Enter,
State = EState.Enter,
BuffCfg = buffCfg,
Owner = owner,
Target = target,

@ -71,7 +71,7 @@ namespace Game
public List<int> GetAllEnemies()
{
var entities = Util.GetGroup(GameMatcher.Hp);
var ret = new List<int>();
var ret = new List<int>();//TODO gc优化
foreach (var entity in entities)
{
if (entity.Team() == ETeam.Monster)

@ -1,83 +1,21 @@
using Entitas;
using UnityEngine;
using Game;
public class AIDirectorSystem : IExecuteSystem, IInitializeSystem
{
private LevelPoolItem _curLevel;
private LevelNodeMonsterWave _curWave;
private float _tickTime;
private float _attackRoundTime;
private float _attackWaitTime;
private int _attackTimes;
public void Initialize()
{
}
public void Execute()
{
if (Util.IsLevelLoading())
{
return;
}
var level = Util.GetCurLevel();
var wave = Util.GetCurWave();
if (level == null || wave == null)
{
return;
}
if (level != _curLevel)
{
_curLevel = level;
return;
}
if (wave != _curWave)
{
_curWave = wave;
Reset();
return;
}
UpdateAIDirectorBlueprint();
}
private void Reset()
{
_attackRoundTime = 0;
_attackWaitTime = 0;
_attackTimes = 0;
}
private void UpdateAIDirectorBlueprint()
{
if (!Util.GetAIDirectorInit())
{
Util.SetAIDirectorInit();
Util.RunBp(GameConst.BlueprintAIDirectorCommon, GameConst.BpEntranceEnter);
}
_tickTime -= Time.deltaTime;
if (_tickTime < 0)
{
_tickTime = GameConst.AIDirectorTick;
Util.RunBp(GameConst.BlueprintAIDirectorCommon, GameConst.BpEntranceUpdate);
}
if (_attackRoundTime < _curWave.attackRound)
{
_attackRoundTime += Time.deltaTime;
return;
}
if (_attackWaitTime < _curWave.attackFrequency)
{
_attackWaitTime += Time.deltaTime;
return;
}
if (_attackTimes >= _curWave.attackTimes)
{
Reset();
return;
}
_attackTimes++;
_attackWaitTime = 0;
Util.RunBp(GameConst.BlueprintAIDirectorCommon, GameConst.BpEntranceExecute);
var level = Util.GetCurLevel();
level.BehaviorTree.Tick();
}
}

@ -50,11 +50,9 @@ public class AISystem : IExecuteSystem, IInitializeSystem
private static void UpdateAI(GameEntity entity)
{
var id = entity.iD;
var ai = entity.aI;
var skill = entity.skill;
var hp = entity.hp;
var buff = entity.buff;
if (!hp.IsAlive)
{
return;

@ -31,11 +31,11 @@ public class BuffSystem : IExecuteSystem, IInitializeSystem
var cfg = buffItem.BuffCfg;
switch (buffItem.State)
{
case EBpState.Enter:
case EState.Enter:
UtilBuff.BuffEffect(buffItem, EBuffEffectTimingType.LevelUp);
buffItem.State = EBpState.Update;
buffItem.State = EState.Update;
break;
case EBpState.Update:
case EState.Update:
if (buffItem.TimeLeft.Value == -1)
{
//永久存在的buff
@ -61,10 +61,10 @@ public class BuffSystem : IExecuteSystem, IInitializeSystem
}
if (buffItem.TimeLeft.Value == 0)
{
buffItem.State = EBpState.Leave;
buffItem.State = EState.Leave;
}
break;
case EBpState.Leave:
case EState.Leave:
buffItem.Level.Value--;
UtilBuff.BuffEffect(buffItem, EBuffEffectTimingType.LevelDown);
if (buffItem.Level.Value <= 0)
@ -74,7 +74,7 @@ public class BuffSystem : IExecuteSystem, IInitializeSystem
}
else
{
buffItem.State = EBpState.Update;
buffItem.State = EState.Update;
buffItem.TimeLeft.Value = buffItem.TimeMax;
buffItem.TimePast = 0;
}

@ -15,7 +15,7 @@ public class RecoverSystem : IExecuteSystem, IInitializeSystem
UpdateRecover(entity);
}
}
public void UpdateRecover(GameEntity entity)
public static void UpdateRecover(GameEntity entity)
{
var hp = entity.hp;
if (!hp.IsAlive)
@ -23,22 +23,20 @@ public class RecoverSystem : IExecuteSystem, IInitializeSystem
return;
}
//护盾恢复
if (hp.ShieldRecoverTimeMax != 0)
if (hp.ShieldRecoverTimeMax == 0) return;
if (hp.ShieldRecoverTime > 0)
{
if (hp.ShieldRecoverTime > 0)
hp.ShieldRecoverTime -= Time.deltaTime;
if (hp.ShieldRecoverTime < 0)
{
hp.ShieldRecoverTime -= Time.deltaTime;
if (hp.ShieldRecoverTime < 0)
{
hp.ShieldRecoverTime = 0;
}
}
else
{
var newShield = hp.Shield.Value + hp.ShieldRecover * Time.deltaTime;
hp.Shield.Value = Mathf.Min(hp.ShieldMax.Value, newShield);
hp.ShieldRecoverTime = 0;
}
}
else
{
var newShield = hp.Shield.Value + hp.ShieldRecover * Time.deltaTime;
hp.Shield.Value = Mathf.Min(hp.ShieldMax.Value, newShield);
}
}
}

@ -2,13 +2,13 @@ using System.Collections.Generic;
using Game;
using UnityEngine;
using Articy.Touhou.Features;
using Ludiq;
public class LevelPoolItem : ObjectPoolItemBase
{
public string CfgId;
public LevelFeature Cfg;
public LevelNodeMonsterWave CurWave; //当前波次配置
public BehaviorTreePoolItem BehaviorTree;//行为树
private GameObject _gameObject;
private Vector3 _playerBorn = GameConst.NoneDir; //玩家出生点
@ -106,19 +106,25 @@ public class LevelPoolItem : ObjectPoolItemBase
if (!item.TryGetComponent<MeshRenderer>(out var meshRenderer)) continue;
var material = meshRenderer.material;
var mainTexture = (Texture2D)material.mainTexture;
var textureSize = mainTexture.Size() / 64f;
var textureSizeX = mainTexture.width / 64f;
var textureSizeY = mainTexture.height / 64f;
_wallMaterialList.Add(material);
if (item.transform.localScale.z > 1f)
{
//竖向墙
material.mainTextureScale = new Vector2(levelRect.x / textureSize.x, 20 / textureSize.y) * 2;
material.mainTextureScale = new Vector2(levelRect.x / textureSizeX, 20 / textureSizeY) * 2;
}
else
{
//横向墙
material.mainTextureScale = new Vector2(levelRect.y / textureSize.x, 20 / textureSize.y) * 2;
material.mainTextureScale = new Vector2(levelRect.y / textureSizeX, 20 / textureSizeY) * 2;
}
}
//导演AI
BehaviorTree = BehaviorTreePoolManager.Instance.CreateAILevel(Cfg.AIRes);
var levelInfo = _gameObject.AddComponent<LevelInfo>();
levelInfo.Tree = BehaviorTree.AIObject.Tree();
}
public void SetPlayerBorn(string preLevelId)
@ -173,7 +179,7 @@ public class LevelPoolItem : ObjectPoolItemBase
});
}
((IAIDirector)BehaviorTree.AIObject).Reset();
NextWave();
}

@ -22,32 +22,37 @@ namespace Game
Drama,
Rest,
None = 99,
}
public class LevelPoolManager : ObjectPoolBase<LevelPoolManager>
{
private readonly string _mLevelPath = "Level/";
private LevelPoolItem _mCurLevel;
private List<string> _mFinishedLevel = new List<string>();
private float _mLoadingTimeLeft;
private Dictionary<ELevelType, string> _mDoorTypeDict = new Dictionary<ELevelType, string>();//关卡类型对应门的实体id
private bool _isAIDirectorInit = false;
private const string LevelPath = "Level/";
private LevelPoolItem _curLevel;
private readonly List<string> _finishedLevel = new List<string>();
private float _loadingTimeLeft;
private readonly Dictionary<ELevelType, string>
_doorTypeDict = new Dictionary<ELevelType, string>(); //关卡类型对应门的实体id
public override void Update()
{
if (_mLoadingTimeLeft == 0)
if (_loadingTimeLeft == 0)
{
return;
}
_mLoadingTimeLeft -= Time.deltaTime;
if (_mLoadingTimeLeft <= 0)
_loadingTimeLeft -= Time.deltaTime;
if (_loadingTimeLeft <= 0)
{
_mLoadingTimeLeft = 0;
_loadingTimeLeft = 0;
Loading(false);
}
}
public override void OnDestroy()
{
}
public void EnterLevel(string levelId)
{
if (string.IsNullOrEmpty(levelId))
@ -55,10 +60,12 @@ namespace Game
Util.Print("关卡id为空");
return;
}
if (_mCurLevel != null)
if (_curLevel != null)
{
_mCurLevel.Destroy();
_curLevel.Destroy();
}
EnterLevelReal(levelId);
}
@ -73,28 +80,31 @@ namespace Game
Util.Print("关卡id错误:", levelId);
return;
}
var cfgLevel = cfg as Level;
item.CfgId = cfg.TechnicalName;
item.Cfg = cfgLevel.GetFeatureLevel();
item.Init();
});
levelNew.SetPlayerBorn(_mCurLevel == null ? "" : _mCurLevel.CfgId);
_mFinishedLevel.Add(levelNew.CfgId);
_mCurLevel = levelNew;
_mCurLevel.CreateLevel();
levelNew.SetPlayerBorn(_curLevel == null ? "" : _curLevel.CfgId);
_finishedLevel.Add(levelNew.CfgId);
_curLevel = levelNew;
_curLevel.CreateLevel();
}
public GameObject CreateLevelGo(string levelId)
{
var path = $"{_mLevelPath}{levelId.ToString()}";
var path = $"{LevelPath}{levelId.ToString()}";
var go = PrefabManager.Instance.CreateGo(path);
go.transform.parent = Root.transform;
return go;
}
private void Loading(bool isLoading)
{
if (isLoading)
{
_mLoadingTimeLeft = GameConst.LoadingMinTime;
_loadingTimeLeft = GameConst.LoadingMinTime;
UIManager.Instance.OpenInNew(EuiPage.Loading);
}
else
@ -109,66 +119,55 @@ namespace Game
// }
}
}
private void LoadDoorTypeDict()
{
var cfgs = Util.GetDoorConfigDataAll();
foreach (var item in cfgs)
{
var cfg = item.Template.Door;
_mDoorTypeDict[(ELevelType)cfg.LevelType] = item.TechnicalName;
_doorTypeDict[(ELevelType)cfg.LevelType] = item.TechnicalName;
}
}
public string GetDoorId(ELevelType levelType)
{
if (!_mDoorTypeDict.ContainsKey(levelType))
if (!_doorTypeDict.ContainsKey(levelType))
{
Util.Print("无该类型的传送门:", levelType);
return "";
}
return _mDoorTypeDict[levelType];
return _doorTypeDict[levelType];
}
public LevelPoolItem GetCurLevel()
{
return _mCurLevel;
return _curLevel;
}
public LevelNodeMonsterWave GetCurWave()
public ILevelMonsterWave GetCurWave()
{
return _mCurLevel.CurWave;
return _curLevel.CurWave ? _curLevel.CurWave : LevelNodeMonsterWave.Default;
}
public bool IsLevelLoading()
{
return _mLoadingTimeLeft > 0;
return _loadingTimeLeft > 0;
}
public List<string> GetFinishedLevel()
{
return _mFinishedLevel;
return _finishedLevel;
}
public int GetDifficulty()
{
return _mCurLevel.Cfg.Difficulty;
}
public bool GetAIDirectorInit()
{
return _isAIDirectorInit;
}
public void SetAIDirectorInit()
{
_isAIDirectorInit = true;
}
public int GetModuleNum(EAIModuleType type)
{
if (_mCurLevel == null)
{
return 0;
}
if (_mCurLevel.CurWave == null)
{
return 0;
}
return _mCurLevel.CurWave.GetModuleNum(type);
return _curLevel.Cfg.Difficulty;
}
}
}
namespace Game
{
public abstract partial class Util
@ -177,37 +176,30 @@ namespace Game
{
LevelPoolManager.Instance.EnterLevel(levelId);
}
public static LevelPoolItem GetCurLevel()
{
return LevelPoolManager.Instance.GetCurLevel();
}
public static LevelNodeMonsterWave GetCurWave()
public static ILevelMonsterWave GetCurWave()
{
return LevelPoolManager.Instance.GetCurWave();
}
public static int GetDifficulty()
{
return LevelPoolManager.Instance.GetDifficulty();
}
public static bool IsLevelLoading()
{
return LevelPoolManager.Instance.IsLevelLoading();
}
public static List<string> GetFinishedLevel()
{
return LevelPoolManager.Instance.GetFinishedLevel();
}
public static bool GetAIDirectorInit()
{
return LevelPoolManager.Instance.GetAIDirectorInit();
}
public static void SetAIDirectorInit()
{
LevelPoolManager.Instance.SetAIDirectorInit();
}
public static int GetModuleNum(EAIModuleType type)
{
return LevelPoolManager.Instance.GetModuleNum(type);
}
}
}

@ -0,0 +1,10 @@
using CleverCrow.Fluid.BTs.Trees;
using UnityEngine;
namespace Game
{
public class LevelInfo : MonoBehaviour
{
[SerializeField] public BehaviorTree Tree;
}
}

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: c93a71e503f44f40917c400d8c36ea8e
timeCreated: 1685546170

@ -4,50 +4,54 @@ using UnityEngine.Serialization;
namespace Game
{
[System.Serializable]
public class NumAttacker
{
public EAIModuleType type;
public int num;
}
public class LevelNodeMonsterWave : LevelNode
public partial class LevelNodeMonsterWave : LevelNode, ILevelMonsterWave
{
[FormerlySerializedAs("AttackRound")] [Header("攻击周期(秒)")] public float attackRound;
[FormerlySerializedAs("AttackFrequency")] [Header("攻击频率(秒/次)")] public float attackFrequency;
[FormerlySerializedAs("AttackTimes")] [Header("攻击次数")] public int attackTimes;
[FormerlySerializedAs("NumAttackers")] [Header("同时攻击人数")] public NumAttacker[] numAttackers;
private int _mWaveIndex;
private LevelNodeMonster[] _mMonsterList;
private Dictionary<EAIModuleType, int> _mNumAttackerDict = new Dictionary<EAIModuleType, int>();
[Rename("攻击周期(秒)")] public float attackRound;
[Rename("攻击频率(秒/次)")] public float attackFrequency;
[Rename("攻击次数")] public int attackTimes;
[Rename("同时攻击人数")] public NumAttacker[] numAttackers;
private int _waveIndex;
private LevelNodeMonster[] _monsterList;
private readonly Dictionary<EAIModuleType, int> _numAttackerDict = new Dictionary<EAIModuleType, int>();
public override void OnInit()
{
_mMonsterList = GetComponentsInChildren<LevelNodeMonster>();
_monsterList = GetComponentsInChildren<LevelNodeMonster>();
for (EAIModuleType i = 0; i < EAIModuleType.Max; i++)
{
_mNumAttackerDict[i] = 0;
_numAttackerDict[i] = 0;
}
for (int i = 0; i < numAttackers.Length; i++)
if (numAttackers != null)
{
var item = numAttackers[i];
_mNumAttackerDict[item.type] += item.num;
foreach (var item in numAttackers)
{
_numAttackerDict[item.type] += item.num;
}
}
}
public LevelNodeMonster[] GetMonsters()
{
return _mMonsterList;
}
public int GetModuleNum(EAIModuleType type)
{
return _mNumAttackerDict[type];
return _monsterList;
}
public void SetWaveIndex(int index)
{
_mWaveIndex = index;
_waveIndex = index;
}
public int GetWaveIndex()
{
return _mWaveIndex;
return _waveIndex;
}
}
}

@ -0,0 +1,63 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Serialization;
namespace Game
{
public interface ILevelMonsterWave
{
public float GetAttackRound();
public float GetAttackFrequency();
public int GetAttackTimes();
public int GetModuleNum(EAIModuleType type);
}
public class LevelMonsterWaveDefault : ILevelMonsterWave
{
public float GetAttackRound()
{
return 2f;
}
public float GetAttackFrequency()
{
return 0.2f;
}
public int GetAttackTimes()
{
return 5;
}
public int GetModuleNum(EAIModuleType type)
{
return 2;
}
}
public partial class LevelNodeMonsterWave
{
public static ILevelMonsterWave Default = new LevelMonsterWaveDefault();
public float GetAttackRound()
{
return attackRound;
}
public float GetAttackFrequency()
{
return attackFrequency;
}
public int GetAttackTimes()
{
return attackTimes;
}
public int GetModuleNum(EAIModuleType type)
{
return _numAttackerDict[type];
}
}
}

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: e5ebdd5045fe4285851c4c727ec74ba8
timeCreated: 1685547416

@ -9,7 +9,6 @@ namespace Game
{
GmManager.Create();
EcsManager.Create();
BlueprintPoolManager.Create();
EntityPoolManager.Create();
EffectPoolManager.Create();
AudioPoolManager.Create();

@ -30,12 +30,14 @@ namespace Game
WeaponNext,
Test1,
}
public enum EKeyActionType
{
Click,
Press,
Release,
}
public enum EMoveCommand
{
Stop,
@ -50,24 +52,28 @@ namespace Game
Jump,
JumpRelease,
}
public enum EMoveCommandType
{
Stop,
Move,
FunctionKey,
}
public enum EJumpState
{
OnGround,
LeavingGround,
InAir,
}
public enum EMovestepType
{
None,
AddForce,
SetSpeed,
}
public enum ESKillPerformance
{
None,
@ -78,6 +84,7 @@ namespace Game
Remote,
Max,
}
public enum EComboStance
{
Idle,
@ -96,6 +103,7 @@ namespace Game
Any = 100,
Cache = 101,
}
public enum EComboTriggerType
{
LightAttack,
@ -106,6 +114,7 @@ namespace Game
Jump,
None,
}
public enum EWeaponChangeType
{
Set0,
@ -116,16 +125,24 @@ namespace Game
SetNext,
None,
}
public enum EHitLevel
{
None,//无
Block,//格挡
Stagger1,//硬直-小
Stagger2,//硬直-中
Stagger3,//硬直-大
Flowing,//浮空
ShieldBreak,//破盾
Stun,//击晕
Kill,//击杀
None, //无
Block, //格挡
Stagger1, //硬直-小
Stagger2, //硬直-中
Stagger3, //硬直-大
Flowing, //浮空
ShieldBreak, //破盾
Stun, //击晕
Kill, //击杀
}
public enum EState
{
Enter,
Update,
Leave,
}
}

@ -12,7 +12,7 @@ public partial class GameEntity
public AIComponent aI { get { return (AIComponent)GetComponent(GameComponentsLookup.AI); } }
public bool hasAI { get { return HasComponent(GameComponentsLookup.AI); } }
public void AddAI(Game.BlueprintBasicData newData, bool newIsInit, Game.EAIModuleType newModuleType, int newTarget, float newThinkCDMax, float newThinkCDNow, Game.MetaData<float> newHungry, Game.MetaData<float> newHungryMax, float newHungryIncrease, float newHungryIncreaseRate)
public void AddAI( bool newIsInit, Game.EAIModuleType newModuleType, int newTarget, float newThinkCDMax, float newThinkCDNow, Game.MetaData<float> newHungry, Game.MetaData<float> newHungryMax, float newHungryIncrease, float newHungryIncreaseRate)
{
var index = GameComponentsLookup.AI;
var component = (AIComponent)CreateComponent(index, typeof(AIComponent));
@ -26,7 +26,7 @@ public partial class GameEntity
AddComponent(index, component);
}
public void ReplaceAI(Game.BlueprintBasicData newData, bool newIsInit, Game.EAIModuleType newModuleType, int newTarget, float newThinkCDMax, float newThinkCDNow, Game.MetaData<float> newHungry, Game.MetaData<float> newHungryMax, float newHungryIncrease, float newHungryIncreaseRate)
public void ReplaceAI( bool newIsInit, Game.EAIModuleType newModuleType, int newTarget, float newThinkCDMax, float newThinkCDNow, Game.MetaData<float> newHungry, Game.MetaData<float> newHungryMax, float newHungryIncrease, float newHungryIncreaseRate)
{
var index = GameComponentsLookup.AI;
var component = (AIComponent)CreateComponent(index, typeof(AIComponent));

@ -12,7 +12,7 @@ public partial class GameEntity
public BulletComponent bullet { get { return (BulletComponent)GetComponent(GameComponentsLookup.Bullet); } }
public bool hasBullet { get { return HasComponent(GameComponentsLookup.Bullet); } }
public void AddBullet(Game.EBpState newState, int newTarget, int newOwner, UnityEngine.Vector3 newCastDir, float newTimeLeft, UnityEngine.Vector3 newPositionPre, Game.BlueprintBasicData newData)
public void AddBullet( int newTarget, int newOwner, UnityEngine.Vector3 newCastDir, float newTimeLeft, UnityEngine.Vector3 newPositionPre)
{
var index = GameComponentsLookup.Bullet;
var component = (BulletComponent)CreateComponent(index, typeof(BulletComponent));
@ -20,7 +20,7 @@ public partial class GameEntity
AddComponent(index, component);
}
public void ReplaceBullet(Game.EBpState newState, int newTarget, int newOwner, UnityEngine.Vector3 newCastDir, float newTimeLeft, UnityEngine.Vector3 newPositionPre, Game.BlueprintBasicData newData)
public void ReplaceBullet(int newTarget, int newOwner, UnityEngine.Vector3 newCastDir, float newTimeLeft, UnityEngine.Vector3 newPositionPre)
{
var index = GameComponentsLookup.Bullet;
var component = (BulletComponent)CreateComponent(index, typeof(BulletComponent));

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 6ecee76f835ec9d4db7d106889dedf73
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 8dd14073b0a1cde4cb50ffeba5595d47
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1,86 +0,0 @@
using System;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;
public static class InstallBoltMenuItem
{
private const string InstallFolder = "Install Bolt";
[MenuItem("Tools/Install Bolt")]
private static void Install()
{
var packageFiles = Directory.GetFiles(Path.Combine(Application.dataPath, InstallFolder), "*.unitypackage");
if (packageFiles.Length == 0)
{
EditorUtility.DisplayDialog("Bolt Install Error", "Could not find any Bolt package file under '" + InstallFolder + "'.", "OK");
return;
}
string matchingPackageFile = null;
foreach (var packageFile in packageFiles)
{
if (PlayerSettings.scriptingRuntimeVersion == InferRuntimeVersion(Path.GetFileNameWithoutExtension(packageFile)))
{
matchingPackageFile = packageFile;
break;
}
}
if (matchingPackageFile == null)
{
EditorUtility.DisplayDialog("Bolt Install Error", "Could not find any Bolt package file that matches the current scripting runtime version: '" + PlayerSettings.scriptingRuntimeVersion + "'.", "OK");
}
if (EditorUtility.DisplayDialog("Install Bolt", "Import Bolt for " + GetRuntimeVersionStringPretty(PlayerSettings.scriptingRuntimeVersion) + "?", "Import", "Cancel"))
{
AssetDatabase.ImportPackage(matchingPackageFile, true);
}
}
private static string GetRuntimeVersionString(ScriptingRuntimeVersion version)
{
switch (version)
{
case ScriptingRuntimeVersion.Latest:
return "NET4";
case ScriptingRuntimeVersion.Legacy:
return "NET3";
default:
return version.ToString();
}
}
private static string GetRuntimeVersionStringPretty(ScriptingRuntimeVersion version)
{
switch (version)
{
case ScriptingRuntimeVersion.Latest:
return ".NET 4.x";
case ScriptingRuntimeVersion.Legacy:
return ".NET 3.x";
default:
return version.ToString();
}
}
private static ScriptingRuntimeVersion? InferRuntimeVersion(string packageName)
{
foreach (var version in Enum.GetValues(typeof(ScriptingRuntimeVersion)).Cast<ScriptingRuntimeVersion>())
{
if (packageName.Contains(GetRuntimeVersionString(version)))
{
return version;
}
}
return null;
}
}

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 69b6a2c878682d74c9227a305df0fabc
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -1,285 +0,0 @@
The Unity Asset Store policy requires that all third-party
licenses be contained in a single LICENSES files.
This file is auto-generated for this purpose.
However, you can find a more readable version of each product's
acknowledgements in its About window, found in the Tools menu.
Acknowledgements below:
- AQN Parser
- Deep Copy
- DotNetZip
- FatCow Icons
- Full Serializer
- Iconmonstr Icons
- MD4 Managed Implementation
- MiscUtil
- Reorderable List
- SQLite .NET
- YamlDotNet
=============================
AQN Parser
Copyright © 2013 Christophe Bertrand
https://www.codeproject.com/Tips/624300/AssemblyQualifiedName-Parser
License: Microsoft Public License
This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.
1. Definitions
The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law.
A "contribution" is the original software, or any additions or changes to the software.
A "contributor" is any person that distributes its contribution under this license.
"Licensed patents" are a contributor's patent claims that read directly on its contribution.
2. Grant of Rights
(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.
(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.
3. Conditions and Limitations
(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.
(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.
(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.
(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.
(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.
=============================
Deep Copy
Copyright © 2014 Alexey Burtsev
https://github.com/Burtsev-Alexey/net-object-deep-copy
License: MIT
The MIT License (MIT)
Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS INTHE SOFTWARE.
=============================
DotNetZip
Copyright © 2017 Ionic
https://dotnetzip.codeplex.com/
License: Microsoft Public License
This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.
1. Definitions
The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law.
A "contribution" is the original software, or any additions or changes to the software.
A "contributor" is any person that distributes its contribution under this license.
"Licensed patents" are a contributor's patent claims that read directly on its contribution.
2. Grant of Rights
(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.
(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.
3. Conditions and Limitations
(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.
(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.
(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.
(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.
(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.
=============================
FatCow Icons
Copyright © 2017 FatCow Web Hosting
https://www.fatcow.com/free-icons
License: Creative Commons Attribution 3.0
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
1. Definitions
"Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with one or more other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License."Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License."Licensor" means the individual, individuals, entity or entities that offers the Work under the terms of this License."Original Author" means the individual, individuals, entity or entities who created the Work."Work" means the copyrightable work of authorship offered under the terms of this License."You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws.
3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:
to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works;to create and reproduce Derivative Works provided that any such Derivative Work, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified.";;to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works;to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works.For the avoidance of doubt, where the Work is a musical composition:
Performance Royalties Under Blanket Licenses. Licensor waives the exclusive right to collect, whether individually or, in the event that Licensor is a member of a performance rights society (e.g. ASCAP, BMI, SESAC), via that society, royalties for the public performance or public digital performance (e.g. webcast) of the Work.Mechanical Rights and Statutory Royalties. Licensor waives the exclusive right to collect, whether individually or via a music rights agency or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions).Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor waives the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions).The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved.
4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:
You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of a recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. When You distribute, publicly display, publicly perform, or publicly digitally perform the Work, You may not impose any technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any credit as required by Section 4(b), as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any credit as required by Section 4(b), as requested.If You distribute, publicly display, publicly perform, or publicly digitally perform the Work (as defined in Section 1 above) or any Derivative Works (as defined in Section 1 above) or Collective Works (as defined in Section 1 above), You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or (ii) if the Original Author and/or Licensor designate another party or parties (e.g. a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and, consistent with Section 3(b) in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(b) may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear, if a credit for all contributing authors of the Derivative Work or Collective Work appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties.5. Representations, Warranties and Disclaimer
UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND ONLY TO THE EXTENT OF ANY RIGHTS HELD IN THE LICENSED WORK BY THE LICENSOR. THE LICENSOR MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MARKETABILITY, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
7. Termination
This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works (as defined in Section 1 above) or Collective Works (as defined in Section 1 above) from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.8. Miscellaneous
Each time You distribute or publicly digitally perform the Work (as defined in Section 1 above) or a Collective Work (as defined in Section 1 above), the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
=============================
Full Serializer
Copyright © 2017 Jacob Dufault
https://www.fatcow.com/free-icons
License: MIT
The MIT License (MIT)
Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS INTHE SOFTWARE.
=============================
Iconmonstr Icons
Author: Alexander Kahlkopf
https://iconmonstr.com
This license agreement (the “Agreement”) sets forth the terms by which Alexander Kahlkopf, the owner of iconmonstr (the “Licensor”), shall provide access to certain Work (defined below) to you (the “Licensee”, “you” or “your”). This Agreement regulates the free use of the icons, fonts, images and other media content (collectively, the “Work”), which is made available via the website iconmonstr.com (the “Website”). By downloading or copying a Work, you agree to be bound by the following terms and conditions.
1. Grant of Rights
The Works on the Website are copyrighted property of Licensor. Licensor hereby grants Licensee a perpetual, non-exclusive, non-transferrable single-user license for the use of the Work based on the conditions of this Agreement. You agree that the Work serves as part of the design and is not the basis or main component of the product, template or application distributed by the Licensee. Furthermore, you agree not to sell, redistribute, sublicense, share or otherwise transfer the Work to other people or entities.
2. Permitted Uses
Licensee may use the Work in non-commercial and commercial projects, services or products without attribution.Licensee may use the Work for any illustrative purposes in any media, including, but not limited to, websites, web banners, newsletters, PDF documents, blogs, emails, slideshows, TV and video presentations, smartphones, splash screens, movies, magazine articles, books, advertisements, brochures, document illustrations, booklets, billboards, business cards, packages, etc.Licensee may use the Work in template or application without attribution; provided, however, that the Work serves as part of the design and is not the basis or main component of the product, template or application distributed by Licensee and is not used contrary to the terms and conditions of this Agreement.Licensee may adapt or change the Work according to his or her requirements.
3. Prohibited Uses
Licensee may not sell, redistribute, sublicense, share or otherwise transfer the Work to other people or entities.Licensee may not use the Work as part of a logo, trademark or service mark.Licensee may not use the Work for pornographic, infringing, defamatory, racist or religiously offensive illustrations.
4. Additional Information on Rights
Certain Works, such as logos or brands, are subject to copyright and require the agreement of a third party for the assignment of these rights. Licensee is responsible for providing all rights, agreements, and licenses for the use of the Work.
5. Termination
This Agreement shall automatically terminate without notice if you do not comply with the terms or conditions specified in this Agreement. If you yourself wish to terminate this Agreement, destroy the Work, all copies and derivatives of the Work and any materials related to it.
6. Indemnification
You agree to indemnify Licensor for any and all claims, liability performances, damages, costs (including attorney fees) or other liabilities that are caused by or related to a breach of this Agreement, which are caused by the use of the Website or Work, by the non-compliance of the use restrictions of a Work or which are caused by the claims of third parties regarding the use of a Work.
7. Warranty and Liability
The Website and the Works are provided “as is.” Licensor does not accept any warranty or liability regarding a Work, the Website, the accuracy of the information or rights described therein or the licenses, which are subject to this Agreement. Licensor is not liable for damages, costs, losses or claims incurred by you, another person or entity by the use of the Website or the Works.
=============================
MD4 Managed Implementation
Copyright © 2005 Motus Technologies Inc., Novell, Inc
https://github.com/mono/mono/blob/master/mcs/class/Mono.Security/Mono.Security.Cryptography/MD4Managed.cs
Author:Sebastien Pouliot (sebastien@ximian.com)
(C) 2003 Motus Technologies Inc. (http://www.motus.com)Copyright (C) 2004-2005,2010 Novell, Inc (http://www.novell.com)
Permission is hereby granted, free of charge, to any person obtaininga copy of this software and associated documentation files (the"Software"), to deal in the Software without restriction, includingwithout limitation the rights to use, copy, modify, merge, publish,distribute, sublicense, and/or sell copies of the Software, and topermit persons to whom the Software is furnished to do so, subject tothe following conditions:
The above copyright notice and this permission notice shall beincluded in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OFMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE ANDNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BELIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTIONOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTIONWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
=============================
MiscUtil
Copyright © 2008 Jon Skeet
http://www.yoda.arachsys.com/csharp/miscutil/index.html
"Miscellaneous Utility Library" Software Licence
Version 1.0
Copyright (c) 2004-2008 Jon Skeet and Marc Gravell.All rights reserved.
Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:
1. Redistributions of source code must retain the above copyrightnotice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyrightnotice, this list of conditions and the following disclaimer in thedocumentation and/or other materials provided with the distribution.
3. The end-user documentation included with the redistribution, ifany, must include the following acknowledgment:
"This product includes software developed by Jon Skeetand Marc Gravell. Contact skeet@pobox.com, or see http://www.pobox.com/~skeet/)."
Alternately, this acknowledgment may appear in the software itself,if and wherever such third-party acknowledgments normally appear.
4. The name "Miscellaneous Utility Library" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact skeet@pobox.com.
5. Products derived from this software may not be called "Miscellaneous Utility Library", nor may "Miscellaneous Utility Library"appear in their name, without prior written permission of Jon Skeet.
THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIEDWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OFMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL JON SKEET BE LIABLE FOR ANY DIRECT, INDIRECT,INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVERCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICTLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING INANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THEPOSSIBILITY OF SUCH DAMAGE.
=============================
Reorderable List
Author: Rotorz Limited
https://bitbucket.org/rotorz/reorderable-list-editor-field-for-unity
License: MIT
The MIT License (MIT)
Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS INTHE SOFTWARE.
=============================
SQLite .NET
Copyright © 2014 Roberto Huertas
https://github.com/codecoding/SQLite4Unity3d
License: MIT
The MIT License (MIT)
Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS INTHE SOFTWARE.
=============================
YamlDotNet
Author: Antoine Aubry
http://aaubry.net/pages/yamldotnet.html
License: MIT
The MIT License (MIT)
Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS INTHE SOFTWARE.

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: cf356c1e3cc166e4db6ffd159585422f
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1,7 +0,0 @@
Thank you for choosing Bolt!
To get started, import the package that matches your project's scripting runtime version (.NET 3 or 4).
If you're not sure, use [ Tools > Install Bolt ].
You can safely delete the "Bolt Install" folder after importing the package.

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 255200306d08e664d8e0f9f7f737426b
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 8f7548e63c4ee6e45a2bb0a8fe03dacd
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: cdc0d6bb66b201d4283a6572fce71c8e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: fbee70d634846f24c89fb53e11703d9f
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1,103 +0,0 @@
fileFormatVersion: 2
guid: 77bfc02ce8d713f4e819be6d4ebdc3ea
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Android: Android
second:
enabled: 1
settings: {}
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
DefaultValueInitialized: true
- first:
Lumin: Lumin
second:
enabled: 1
settings: {}
- first:
Nintendo Switch: Switch
second:
enabled: 1
settings: {}
- first:
PS4: PS4
second:
enabled: 1
settings: {}
- first:
Standalone: Linux
second:
enabled: 1
settings: {}
- first:
Standalone: Linux64
second:
enabled: 1
settings: {}
- first:
Standalone: LinuxUniversal
second:
enabled: 1
settings: {}
- first:
Standalone: OSXUniversal
second:
enabled: 1
settings: {}
- first:
Standalone: Win
second:
enabled: 1
settings: {}
- first:
Standalone: Win64
second:
enabled: 1
settings: {}
- first:
WebGL: WebGL
second:
enabled: 1
settings: {}
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 1
settings:
CPU: AnyCPU
- first:
XboxOne: XboxOne
second:
enabled: 1
settings: {}
- first:
iPhone: iOS
second:
enabled: 1
settings: {}
- first:
tvOS: tvOS
second:
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1 +0,0 @@
GUID_7314928a14330c04fb980214791646e9;TARGET_INCLUDE_EDITOR;RELEASE;NET_4_6

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 6632b1d377cddc14ab6cadb2864679a9
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1,34 +0,0 @@
fileFormatVersion: 2
guid: 7314928a14330c04fb980214791646e9
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any: ''
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData: ''
assetBundleName: ''
assetBundleVariant: ''
...

@ -1,28 +0,0 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Bolt.Core.Editor</name>
</assembly>
<members>
<member name="P:Bolt.BoltCoreConfiguration.dimInactiveNodes">
<summary>
Whether inactive graph nodes should be dimmed.
</summary>
</member>
<member name="P:Bolt.BoltCoreConfiguration.dimIncompatibleNodes">
<summary>
Whether incompatible graph nodes should be dimmed.
</summary>
</member>
<member name="P:Bolt.BoltCoreConfiguration.showVariablesHelp">
<summary>
Whether the header help panel should be shown in the variables window.
</summary>
</member>
<member name="P:Bolt.BoltCoreConfiguration.createSceneVariables">
<summary>
Whether the scene variables object should be created automatically.
</summary>
</member>
</members>
</doc>

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 97c64f35b1f7d4242a3c82839c63d105
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1 +0,0 @@
GUID_c8d0ad23af520fe46aabe2b1fecf6462;TARGET_INCLUDE_ALL;TARGET_BACKEND_IL2CPP;RELEASE;NET_4_6

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 6bc196351376cd34785cb86df95c3df4
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1,117 +0,0 @@
fileFormatVersion: 2
guid: c8d0ad23af520fe46aabe2b1fecf6462
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap:
Bolt.AnimatorMessageListener: {fileID: 2800000, guid: 21763ada12b1de54a9de03382ecdf3fe,
type: 3}
Bolt.GlobalMessageListener: {fileID: 2800000, guid: 0129cf6bb23df2f41824eda97d16ee6e,
type: 3}
Bolt.SceneVariables: {fileID: 2800000, guid: 85b733ff25d1eee479a6d510562bd0b2,
type: 3}
Bolt.UnityMessageListener: {fileID: 2800000, guid: 310bebb331cf47f42b7f0b57b1f5bfcf,
type: 3}
Bolt.VariablesAsset: {fileID: 2800000, guid: 7e1f811eb716b3844aad1127122172ed,
type: 3}
Bolt.VariablesSaver: {fileID: 2800000, guid: c49720c31a0991d48aa5d1fcf9d6d1a6,
type: 3}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Android: Android
second:
enabled: 1
settings:
ScriptingBackend: Il2Cpp
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
DefaultValueInitialized: true
- first:
Lumin: Lumin
second:
enabled: 1
settings: {}
- first:
Nintendo Switch: Switch
second:
enabled: 1
settings: {}
- first:
PS4: PS4
second:
enabled: 1
settings: {}
- first:
Standalone: Linux
second:
enabled: 1
settings: {}
- first:
Standalone: Linux64
second:
enabled: 1
settings: {}
- first:
Standalone: LinuxUniversal
second:
enabled: 1
settings: {}
- first:
Standalone: OSXUniversal
second:
enabled: 1
settings: {}
- first:
Standalone: Win
second:
enabled: 1
settings: {}
- first:
Standalone: Win64
second:
enabled: 1
settings: {}
- first:
WebGL: WebGL
second:
enabled: 1
settings: {}
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 1
settings:
CPU: AnyCPU
ScriptingBackend: Il2Cpp
- first:
XboxOne: XboxOne
second:
enabled: 1
settings: {}
- first:
iPhone: iOS
second:
enabled: 1
settings: {}
- first:
tvOS: tvOS
second:
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1,46 +0,0 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Bolt.Core.Runtime</name>
</assembly>
<members>
<member name="F:Bolt.VariableKind.Flow">
<summary>
Temporary variables local to the execution flow.
</summary>
</member>
<member name="F:Bolt.VariableKind.Graph">
<summary>
Variables local to the current graph.
</summary>
</member>
<member name="F:Bolt.VariableKind.Object">
<summary>
Variables shared across the current game object.
</summary>
</member>
<member name="F:Bolt.VariableKind.Scene">
<summary>
Variables shared across the current scene.
</summary>
</member>
<member name="F:Bolt.VariableKind.Application">
<summary>
Variables shared across scenes.
These will be reset when the application quits.
</summary>
</member>
<member name="F:Bolt.VariableKind.Saved">
<summary>
Variables that persist even after the application quits.
Unity object references are not supported.
</summary>
</member>
<member name="T:Bolt.VariablesSaver">
<summary>
Listens to the OnApplicationQuit on OnApplicationPause
hooks to trigger the serialization of saved variables into PlayerPrefs.
</summary>
</member>
</members>
</doc>

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 5d69e9485c470d44d91bf2c782522f2f
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1 +0,0 @@
GUID_6cb65bfc2ee1c854ca1382175f3aba91;TARGET_INCLUDE_EDITOR;RELEASE;NET_4_6

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 685819a806c873e4781f1082512fafda
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1,34 +0,0 @@
fileFormatVersion: 2
guid: 6cb65bfc2ee1c854ca1382175f3aba91
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any: ''
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData: ''
assetBundleName: ''
assetBundleVariant: ''
...

@ -1,58 +0,0 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Bolt.Flow.Editor</name>
</assembly>
<members>
<member name="P:Bolt.BoltFlowConfiguration.updateUnitsAutomatically">
<summary>
(Experimental) Whether the unit database should be incrementally updated
whenever a codebase change is detected.
</summary>
</member>
<member name="P:Bolt.BoltFlowConfiguration.predictPotentialNullReferences">
<summary>
Whether predictive debugging should warn about null value inputs.
Note that in some cases, this setting may report false positives.
</summary>
</member>
<member name="P:Bolt.BoltFlowConfiguration.predictPotentialMissingComponents">
<summary>
Whether predictive debugging should warn about missing components.
Note that in some cases, this setting may report false positives.
</summary>
</member>
<member name="P:Bolt.BoltFlowConfiguration.showConnectionValues">
<summary>
Whether values should be shown on flow graph connections.
</summary>
</member>
<member name="P:Bolt.BoltFlowConfiguration.predictConnectionValues">
<summary>
Whether predictable values should be shown on flow graph connections.
</summary>
</member>
<member name="P:Bolt.BoltFlowConfiguration.hidePortLabels">
<summary>
Whether labels should be hidden on ports when the value can be deduced from the context.
Disabling will make units more explicit but less compact.
</summary>
</member>
<member name="P:Bolt.BoltFlowConfiguration.animateControlConnections">
<summary>
Whether active control connections should show a droplet animation.
</summary>
</member>
<member name="P:Bolt.BoltFlowConfiguration.animateValueConnections">
<summary>
Whether active value connections should show a droplet animation.
</summary>
</member>
<member name="P:Bolt.BoltFlowConfiguration.skipContextMenu">
<summary>
When active, right-clicking a flow graph will skip the context menu
and instantly open the fuzzy finder. To open the context menu, hold shift.
</summary>
</member>
</members>
</doc>

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: f4e94c3cd4ea068498373aae6135243d
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -1 +0,0 @@
GUID_a040fb66244a7f54289914d98ea4ef7d;TARGET_INCLUDE_ALL;TARGET_BACKEND_IL2CPP;RELEASE;NET_4_6

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save