You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
5.4 KiB
148 lines
5.4 KiB
using System;
|
|
using System.IO;
|
|
using AOT;
|
|
using CoreGame;
|
|
using CoreGame.Render;
|
|
using Entitas;
|
|
using UnityEngine;
|
|
using UnityEngine.Animations;
|
|
using xFrame;
|
|
|
|
namespace CoreGame.Render
|
|
{
|
|
// 资源加载这块很烂,需要整改
|
|
public class ReallyAttachAssetSystem : IExecuteSystem
|
|
{
|
|
readonly IGroup<CombatEntity> m_Group;
|
|
|
|
public ReallyAttachAssetSystem(Contexts contexts)
|
|
{
|
|
m_Group = contexts.combat.GetGroup(CombatMatcher.AttachAsset);
|
|
}
|
|
|
|
public void Execute(float deltaTime)
|
|
{
|
|
m_Group.GetEntities(Contexts.s_CacheEntities);
|
|
if (Contexts.s_CacheEntities.Count == 0)
|
|
return;
|
|
|
|
var entities = Contexts.s_CacheEntities;
|
|
for (int i = 0; i < entities.Count; i++)
|
|
{
|
|
ProcessSingle(entities[i], deltaTime);
|
|
}
|
|
}
|
|
|
|
private void AttachHand(BindPointProxy pointProxy, BindPointProxy parentEntityBindPointProxy, int b1, int pb2)
|
|
{
|
|
if (pointProxy.GetBindPointMap().TryGetValue(b1, out var bp2)
|
|
&& parentEntityBindPointProxy.GetBindPointMap().TryGetValue(pb2, out var parentBp2))
|
|
{
|
|
if (parentBp2.gameObject.TryGetComponent<PositionConstraint>(out var positionConstraint) == false)
|
|
{
|
|
positionConstraint = parentBp2.gameObject.AddComponent<PositionConstraint>();
|
|
positionConstraint.AddSource(new ConstraintSource
|
|
{
|
|
sourceTransform = bp2,
|
|
weight = 1
|
|
});
|
|
}
|
|
else
|
|
{
|
|
positionConstraint.SetSource(0, new ConstraintSource
|
|
{
|
|
sourceTransform = bp2,
|
|
weight = 1
|
|
});
|
|
}
|
|
|
|
positionConstraint.constraintActive = true;
|
|
}
|
|
}
|
|
|
|
private void ProcessSingle(CombatEntity ent, float dt)
|
|
{
|
|
var parentEntity = ent.parentRecorder.ParentEntity;
|
|
var attachAsset = ent.attachAsset;
|
|
|
|
attachAsset.retryTime -= dt;
|
|
if (attachAsset.retryTime < 0)
|
|
{
|
|
XLog.LogWarning($"AttachAssetComponent retryTime < 0 {ent}");
|
|
ent.RemoveAttachAsset();
|
|
return;
|
|
}
|
|
var parentEntityAsset = parentEntity.asset;
|
|
if (parentEntityAsset == null)
|
|
return;
|
|
|
|
ref var mainAssetParam = ref parentEntityAsset.mainAssetParam;
|
|
if (mainAssetParam.reuseGoData.go == false)
|
|
return;
|
|
|
|
var parentEntityBindPointProxy = parentEntity.bindPointProxy;
|
|
var pointProxy = ent.bindPointProxy;
|
|
if (parentEntityBindPointProxy == null)
|
|
return;
|
|
|
|
parentEntityBindPointProxy.TryGetBindPointOrDefault(attachAsset.bindPointType, out var bindPoint);
|
|
|
|
var asset = ent.asset;
|
|
if (asset == null)
|
|
return;
|
|
|
|
var reuseGoData = asset.mainAssetParam.reuseGoData;
|
|
if (reuseGoData.go == false)
|
|
return;
|
|
|
|
reuseGoData.go.transform.SetParent(bindPoint, false);
|
|
reuseGoData.go.SetActiveWrap(attachAsset.isActive);
|
|
|
|
ent.RemoveAttachAsset();
|
|
// 非激活状态不挂载
|
|
if (attachAsset.isActive == false)
|
|
return;
|
|
parentEntityAsset.RecordLinkEnt(ent.creationIndex);
|
|
if (pointProxy != null)
|
|
{
|
|
parentEntityBindPointProxy.AttachFallbackBindPoint(pointProxy.GetBindPointMap());
|
|
|
|
AttachHand(pointProxy, parentEntityBindPointProxy, (int)BindPointType.LHoldPoint, (int)BindPointType.LHand);
|
|
AttachHand(pointProxy, parentEntityBindPointProxy, (int)BindPointType.RHoldPoint, (int)BindPointType.RHand);
|
|
}
|
|
|
|
GunSrv.ShowCircleVfx(parentEntity, ent);
|
|
|
|
|
|
// 如果有动画,也要挂载进去
|
|
var parentEntityAnimationProxy = parentEntity.animationProxy;
|
|
if (parentEntityAnimationProxy != null)
|
|
{
|
|
var subAssetData = SptPool<SubAssetData>.Malloc();
|
|
subAssetData.reuseGoData = reuseGoData;
|
|
var path = asset.mainAssetParam.path;
|
|
var fileName = Path.GetFileName(path);
|
|
if (path != null)
|
|
{
|
|
try
|
|
{
|
|
var skinParam = new SkinParam
|
|
{
|
|
bpType = attachAsset.bindPointType,
|
|
path = UnrealNames.GetFName(path.Substring(0, path.Length - fileName.Length - 1)),
|
|
animPrefix = UnrealNames.GetFName(fileName.Substring(0, fileName.LastIndexOf('.')))
|
|
};
|
|
parentEntityAnimationProxy.PushPartAnimancer(subAssetData, skinParam);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
XLog.LogWarning($"path {path} fileName {fileName} e {e}");
|
|
}
|
|
}
|
|
subAssetData.reuseGoData = null;
|
|
SptPool<SubAssetData>.Free(ref subAssetData);
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|