NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Weapon/ViewWeapon.cs

292 lines
11 KiB
C#
Raw Normal View History

2023-12-13 16:20:41 +08:00
using Code.Scripts.Gameplay.Weapon;
using Cysharp.Threading.Tasks;
2023-10-19 15:00:19 +08:00
using Gameplay.Performance;
using Gameplay.Pool;
using Gameplay.PostProcess.BlackArea;
2023-12-13 16:20:41 +08:00
using Gameplay.Unit;
using Gameplay.Unit.Data;
2023-08-22 19:08:45 +08:00
namespace Gameplay.Weapon
{
using cfg.WeaponCfg;
using Character;
using Framework;
using Common;
using Effect;
using UnityEngine;
public class ViewWeapon
{
2023-10-19 15:00:19 +08:00
public readonly Character owner;
2023-08-22 19:08:45 +08:00
2023-10-19 15:00:19 +08:00
public readonly DataWeapon rawConfig;
2023-08-22 19:08:45 +08:00
2023-10-19 15:00:19 +08:00
public readonly GameObject rootObj;
2023-08-22 19:08:45 +08:00
2023-10-19 15:00:19 +08:00
public readonly Transform fireTrans;
2024-03-13 13:15:12 +08:00
2023-10-25 13:52:37 +08:00
public readonly WeaponAnim weaponAnim;
2024-03-13 13:15:12 +08:00
public readonly Transform weaponBone;
2023-08-22 19:08:45 +08:00
2023-11-02 19:53:39 +08:00
// private readonly List<WeaponLine> _lines;
2023-08-22 19:08:45 +08:00
public ViewWeapon(Character owner)
{
this.owner = owner;
var weaponId = owner.runtimeData.configData.weaponId;
rawConfig = TableManager.Instance.Tables.WeaponConfig.Get(weaponId);
// 找到骨骼
2023-10-19 15:00:19 +08:00
var parentPointName = rawConfig.ParentPointName;
if (string.IsNullOrEmpty(parentPointName))
{
DebugUtil.LogError("武器配置错误: {0}, 没有ParentPointName", weaponId);
parentPointName = "Grip_point01";
}
var bone = owner.Skeleton.GetBone(parentPointName);
2023-08-22 19:08:45 +08:00
if (bone == null)
{
2023-10-19 15:00:19 +08:00
owner.LogError("找不到骨骼:" + rawConfig.ParentPointName);
2023-08-22 19:08:45 +08:00
return;
}
weaponBone = bone.transform;
2023-08-22 19:08:45 +08:00
// 绑定武器
if (bone.transform.childCount == 0)
{
this.owner.LogError($"当前角色 {owner.runtimeData.configData.nameId} 武器节点下未正确挂载武器");
// 未挂载武器直接使用角色的trans作为fire点
fireTrans = this.owner.RawAnimator.transform;
return;
}
var findTrans = bone.transform.GetChild(0);
rootObj = findTrans.gameObject;
weaponAnim = new WeaponAnim(rootObj, owner);
2024-03-13 13:15:12 +08:00
2023-08-22 19:08:45 +08:00
// 美术约定从该节点取fire点
fireTrans = owner.Skeleton.GetBone("Fire");
if (fireTrans == null)
{
DebugUtil.LogError($"当前角色 {owner.runtimeData.configData.nameId} 没有Fire节点, 使用角色的trans作为fire点");
fireTrans = owner.RawAnimator.transform;
}
2023-08-22 19:08:45 +08:00
2023-11-02 19:53:39 +08:00
// _lines = new List<WeaponLine>();
2023-08-22 19:08:45 +08:00
}
public void OpenFire(GameUnit enemy)
{
if (owner.commonData.troopId != ETroopsId.Self)
{
BlackAreaManager.instance.LightUpCell(owner.transData.cellIndex, 1f);
}
2023-10-19 15:00:19 +08:00
var groundEffectId = GLConfig.Inst.data.GroundFireEffectId;
if (groundEffectId > 0)
{
var firePos = fireTrans.position;
firePos.y = 0.1f;
var rot = owner.Node.GameObject.transform.rotation;
EffectManager.instance.PlayEffectById(groundEffectId, firePos, rot);
}
2024-03-13 13:15:12 +08:00
2023-10-19 15:00:19 +08:00
if (rawConfig.FireAudioId.Count > 0)
{
var fireAudioId = rawConfig.FireAudioId[Random.Range(0, rawConfig.FireAudioId.Count)];
AudioManager.Instance.PlayAudioOld(fireAudioId, fireTrans.position).Forget();
2023-10-19 15:00:19 +08:00
}
2023-08-22 19:08:45 +08:00
var fireEffectId = rawConfig.FireEffectId;
if (fireEffectId > 0)
{
var rot = owner.Node.GameObject.transform.rotation;
2024-02-29 15:21:26 +08:00
EffectManager.instance.PlayEffectById(fireEffectId, fireTrans.position, rot, fireTrans);
2023-08-22 19:08:45 +08:00
}
var lineEffectId = rawConfig.FlyEffectId;
2023-10-19 15:00:19 +08:00
if (lineEffectId > 0 && PerformanceManager.instance.data.enableBulletTail)
2023-08-22 19:08:45 +08:00
{
2023-10-19 15:00:19 +08:00
var flySpeed = rawConfig.BulletFlySpeed;
if (flySpeed <= 0)
{
DebugUtil.LogError($"武器配置错误: {rawConfig.ID}, 没有FlySpeed");
flySpeed = 100;
}
_EmitLine(fireTrans, enemy.Node.GameObject.transform, flySpeed);
2023-08-22 19:08:45 +08:00
}
2024-03-13 13:15:12 +08:00
}
public void PlayMatchFireAnim()
{
if (weaponAnim == null) return;
2023-10-25 13:52:37 +08:00
weaponAnim.PlayAnim(rawConfig.FireAnimName);
2023-08-22 19:08:45 +08:00
}
public void PlayMatchReloadAnim()
{
if (weaponAnim == null) return;
weaponAnim.PlayAnim(rawConfig.ReleadAnimName);
}
2023-08-22 19:08:45 +08:00
private void _EmitLine(Transform start,
Transform end,
float flySpeed)
{
2023-11-02 19:53:39 +08:00
var endPos = end.position;
var startPos = start.position;
endPos.y = startPos.y * 0.5f;
var toEnd = endPos - startPos;
2023-08-22 19:08:45 +08:00
var angle = Vector3.SignedAngle(Vector3.forward, toEnd, Vector3.up);
2024-03-13 13:15:12 +08:00
2023-11-02 19:53:39 +08:00
var effect = EffectManager.instance.PlayEffectById(rawConfig.FlyEffectId, startPos, Quaternion.Euler(0, angle, 0));
var totalDistance = toEnd.magnitude;
var flyLogic = ObjPoolManager.instance.Get<BulletFlyLogic>();
2024-01-02 15:11:37 +08:00
var flyTime = totalDistance / flySpeed;
flyLogic.Ctor(startPos, endPos, flyTime);
2023-11-02 19:53:39 +08:00
effect.AddLogic(flyLogic);
2024-01-02 15:11:37 +08:00
#if UNITY_EDITOR
Debug.DrawLine(startPos, endPos, Color.red, flyTime);
#endif
2024-03-13 13:15:12 +08:00
2023-11-02 19:53:39 +08:00
// var line = ObjPoolManager.instance.Get<WeaponLine>();
// // line.effect.transform.LookAt(end, Vector3.up);
// var position = end.position;
// var endPos = position;
// var position1 = start.position;
// endPos.y = position1.y;
// var toEnd = endPos - position1;
// var angle = Vector3.SignedAngle(Vector3.forward, toEnd, Vector3.up);
//
// line.effect = EffectManager.instance.PlayEffectById(rawConfig.FlyEffectId, position1, Quaternion.Euler(0, angle, 0));
//
// line.StartFly(position, flySpeed);
// _lines.Add(line);
2023-08-22 19:08:45 +08:00
}
public static void ShowHitEffect(GameUnit enemy,
2023-10-19 15:00:19 +08:00
bool isCritical,
DataWeapon rawConfig,
Transform senderTrans)
2023-08-22 19:08:45 +08:00
{
var effectId = isCritical ? rawConfig.CriticalHitEffectId : rawConfig.HitEffectId;
if (effectId <= 0)
return;
var hitPoints = GetPoints(enemy);
if (hitPoints == null)
{
2023-10-19 15:00:19 +08:00
DebugUtil.LogError("暂未处理的类型:{0} name: {1}", enemy.gameunitType, enemy.Node.GameObject.name);
2023-08-22 19:08:45 +08:00
return;
}
var points = isCritical ? hitPoints.m_CriticalPoints : hitPoints.m_OtherPoints;
var randomPoint = points[Random.Range(0, points.Length)];
var sender = senderTrans;
var senderPos = sender.position;
var position = randomPoint.position;
var toSenderPos = senderPos - position;
toSenderPos.y = 0;
var angle = Vector3.SignedAngle(Vector3.forward, toSenderPos, Vector3.up);
2024-04-11 17:44:50 +08:00
var rot = Quaternion.Euler(0, angle + 180, 0);
2023-08-22 19:08:45 +08:00
var effectObj = EffectManager.instance.PlayEffectById(effectId, position, rot);
// effectObj.transform.LookAt(fireTrans, Vector3.up);
}
public static CmpCharacterEffectPoints GetPoints(GameUnit enemy)
{
switch (enemy.gameunitType)
{
case EGameUnitType.Character:
{
if (enemy.RawAnimator == null) return null;
var cmp = enemy.RawAnimator.GetComponent<CmpCharacterEffectPoints>();
if (cmp == null)
{
2023-10-19 15:00:19 +08:00
DebugUtil.LogError("{0} 上未挂载:CmpCharacterEffectPoints 节点", enemy.Node.GameObject.name);
2023-08-22 19:08:45 +08:00
cmp = enemy.RawAnimator.gameObject.AddComponent<CmpCharacterEffectPoints>();
cmp.m_CriticalPoints = new Transform[1];
cmp.m_CriticalPoints[0] = enemy.Node.GameObject.transform;
cmp.m_OtherPoints = new Transform[1];
cmp.m_OtherPoints[0] = enemy.Node.GameObject.transform;
}
return cmp;
}
case EGameUnitType.Vehicle:
2024-03-13 13:15:12 +08:00
case EGameUnitType.Summon:
2024-06-04 14:57:24 +08:00
case EGameUnitType.BeProtect:
2023-08-22 19:08:45 +08:00
{
2023-10-19 15:00:19 +08:00
var getCmp = enemy.Node.GameObject.GetComponent<CmpCharacterEffectPoints>();
if (getCmp != null)
{
return getCmp;
}
2023-08-22 19:08:45 +08:00
var cmp = enemy.Node.GameObject.AddComponent<CmpCharacterEffectPoints>();
cmp.m_CriticalPoints = new Transform[1];
cmp.m_CriticalPoints[0] = enemy.Node.GameObject.transform;
cmp.m_OtherPoints = new Transform[1];
cmp.m_OtherPoints[0] = enemy.Node.GameObject.transform;
return cmp;
}
}
return null;
}
public void ViewUpdate(float dt)
{
2023-11-02 19:53:39 +08:00
// for (var i = 0; i < _lines.Count; ++i)
// {
// var line = _lines[i];
// line.ViewUpdate(dt);
// if (line.needRemove)
// {
// ObjPoolManager.instance.Return(line);
// line.DestroyEffect();
// _lines.RemoveAt(i);
// --i;
// }
// }
2023-08-22 19:08:45 +08:00
}
2023-11-02 19:53:39 +08:00
// public void Destroy()
// {
// for (var i = 0; i < _lines.Count; ++i)
// {
// var line = _lines[i];
// line.DestroyEffect();
// }
// _lines.Clear();
// }
2023-08-22 19:08:45 +08:00
public void Hide()
{
if (weaponBone == null) return;
weaponBone.localScale = Vector3.zero;
weaponBone.gameObject.SetActive(false);
2024-04-08 16:56:34 +08:00
var childBone = weaponBone.transform.GetChild(0);
if (childBone != null)
{
childBone.transform.localScale = Vector3.zero;
childBone.gameObject.SetActive(false);
2024-04-08 16:56:34 +08:00
}
2023-08-22 19:08:45 +08:00
}
public void Show()
{
if (weaponBone == null) return;
weaponBone.localScale = Vector3.one;
weaponBone.gameObject.SetActive(true);
if (weaponBone.transform.childCount != 0)
2024-04-08 16:56:34 +08:00
{
var childBone = weaponBone.transform.GetChild(0);
2024-04-08 16:56:34 +08:00
childBone.transform.localScale = Vector3.one;
childBone.gameObject.SetActive(true);
2024-04-08 16:56:34 +08:00
}
2023-08-22 19:08:45 +08:00
}
}
}