using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Cysharp.Threading.Tasks; using Gameplay.Unit; using Gameplay.Unit.Data; using Gameplay.Vehicle.Impl; using PhxhSDK; namespace Gameplay.Bullet { using UnityEngine; using Character; using LTGame; using cfg.BulletCfg; using Level; using Framework; using Common; public class ViewBullet { public GameObject rootObj; public readonly GameUnit sender; public GameUnit lockUnit; public int targetCellIndex; public readonly DataBullet configData; public bool needRemove = false; private NStateMachine _fsm; public readonly Map map; public ViewBullet(DataBullet configData, GameUnit sender) { this.configData = configData; map = LevelManager.Instance.CurrentLevel.Map; this.sender = sender; rootObj = new GameObject(); rootObj.transform.SetParent(BulletManager.instance.rootObj.transform); var firePoint = _GetFireTrans(); rootObj.transform.position = firePoint.position; // 这里使用sender的旋转 rootObj.transform.rotation = sender.Node.GameObject.transform.rotation; _InitFsm(); } private Transform _GetFireTrans() { switch (sender.gameunitType) { case EGameUnitType.Character: var character = sender as Character; return character.weapon.fireTrans; case EGameUnitType.Vehicle: var normalVehicle = sender as NormalVehicle; return normalVehicle.battery.fireTrans; } DebugUtil.LogError("暂未支持的类型:{0}", sender.gameunitType); return null; } public void Init() { _CreateView(); } public static string GetPrefabPath(string fileName) { return $"Assets/Art/Gfx/Character/{fileName}.prefab"; } private async void _CreateView() { var prefabPath = GetPrefabPath(configData.PrefabPath); BulletManager.instance.RecordLoadCount(prefabPath); var sampleObj = await AssetManager.Instance.LoadAssetAsync(prefabPath); if (sampleObj == null) { DebugUtil.LogError("加载子弹资源失败:{0}", prefabPath); return; } if (rootObj == null) { // 已经销毁了 return; } var bulletObj = Object.Instantiate(sampleObj, rootObj.transform); bulletObj.SetActive(false); if (rootObj == null) { // 已经销毁了 bulletObj.Destroy(); return; } // bulletObj.transform.SetParent(rootObj.transform); bulletObj.transform.ResetLocals(); rootObj.SetLayerEx(rootObj.layer); bulletObj.SetActive(true); } private void _InitFsm() { _fsm = new NStateMachine(); _fsm.Add(new BulletStateDestroy(this)); } public void LockPos(int cellIndex) { targetCellIndex = cellIndex; _fsm.Add(new BulletStateLockPosFly(this)); _fsm.Add(new BulletStatePosBoom(this)); _fsm.ChangeState(EBulletState.LockPosFly); } public void LockUnit(GameUnit lockUnit) { this.lockUnit = lockUnit; _fsm.Add(new BulletStateUnitLockFly(this)); _fsm.Add(new BulletStateDamageUnit(this)); _fsm.ChangeState(EBulletState.UnitLockFly); } public void LogicUpdate(float dt) { if (needRemove) return; _fsm.LogicUpdate(dt); } public void Destroy() { // 播放销毁音效 var audioId = configData.HitAudioId; if (audioId > 0) { AudioManager.Instance.PlayAudioOld(audioId, AudioCriManager.EPlayType.Sound, rootObj).Forget(); } // 销毁obj if (rootObj != null) { rootObj.Destroy(); rootObj = null; } } } }