1
This commit is contained in:
@@ -88,10 +88,16 @@ public class SitPosData : MonoBehaviour
|
||||
public TurretData currentZhanShenData;
|
||||
|
||||
// -------------------------
|
||||
// 战神激光(锁定时显示)
|
||||
// 战神激光(锁定时显示):两种形态
|
||||
// - laserPrefab 非空 → 预制体形态:JiGuangControl 工具类驱动(克隆激光预制体,方向/长度每帧刷新)
|
||||
// - laserPrefab 为空 → LineRenderer 兜底形态:直接新建 GameObject + LineRenderer
|
||||
// -------------------------
|
||||
/// <summary>战神激光对象列表(世界空间 LineRenderer,起点=子弹创建位置,终点=锁定鱼的位置)。三发锁定=3条</summary>
|
||||
/// <summary>LineRenderer 形态激光列表(起点=子弹创建位置,终点=锁定鱼的位置)。三发锁定=3条</summary>
|
||||
private readonly List<LineRenderer> _zhanShenLasers = new List<LineRenderer>();
|
||||
/// <summary>预制体形态激光实例列表(世界空间,由 JiGuangControl.JiGuangCreate 按目标数量重建)</summary>
|
||||
private readonly List<Transform> _laserFx = new List<Transform>();
|
||||
/// <summary>预制体形态激光的基准缩放(重建时取自 laserPrefab.transform.localScale)</summary>
|
||||
private Vector3 _laserFxBaseScale = Vector3.one;
|
||||
|
||||
// -------------------------
|
||||
// XJMH 炮台列表(星际迷航专用)
|
||||
@@ -234,8 +240,9 @@ public class SitPosData : MonoBehaviour
|
||||
// ==================== 战神激光(锁定时显示) ====================
|
||||
|
||||
/// <summary>
|
||||
/// 战神锁定时显示激光(LineRenderer):起点=创建子弹的位置(GetBulletStartPos),终点=锁定鱼的位置。
|
||||
/// ⭐ 一个锁定点一条线:单发锁定=1条,三发锁定=3条(主目标+2个三发目标)。
|
||||
/// 战神锁定时显示激光:起点=创建子弹的位置(GetBulletStartPos),终点=锁定鱼的位置,Z 统一压到 -50 显示层。
|
||||
/// ⭐ 一个锁定点一条激光:单发锁定=1条,三发锁定=3条(主目标+2个三发目标)。
|
||||
/// ⭐ 两种形态:laserPrefab 非空 → 预制体形态(JiGuangControl 工具类);为空 → LineRenderer 兜底形态。
|
||||
/// ⭐ 只是视觉表现:打中鱼仍按正常攻击频率由子弹完成(HandleAutoFire 以 attackTime 发射锁定子弹)。
|
||||
/// 普通炮台没有此效果(currentZhanShenData 为 null 时不显示)。
|
||||
/// </summary>
|
||||
@@ -248,7 +255,7 @@ public class SitPosData : MonoBehaviour
|
||||
if (monCotl_Lock_Position != null && monCotl_Lock_Position.gameObject.activeInHierarchy)
|
||||
_laserTargets.Add(monCotl_Lock_Position);
|
||||
|
||||
// 三发锁定:每个有效目标一条线(主目标已在上面,这里只补额外的)
|
||||
// 三发锁定:每个有效目标一条激光(主目标已在上面,这里只补额外的)
|
||||
if (tripleLockTargets.Count > 0)
|
||||
{
|
||||
for (int i = 0; i < tripleLockTargets.Count && i < tripleLockPositions.Count; i++)
|
||||
@@ -266,14 +273,68 @@ public class SitPosData : MonoBehaviour
|
||||
// 没有锁定点:隐藏所有激光
|
||||
if (_laserTargets.Count == 0)
|
||||
{
|
||||
for (int i = 0; i < _zhanShenLasers.Count; i++)
|
||||
{
|
||||
if (_zhanShenLasers[i] != null && _zhanShenLasers[i].gameObject.activeSelf)
|
||||
_zhanShenLasers[i].gameObject.SetActive(false);
|
||||
}
|
||||
HideZhanShenLasers();
|
||||
return;
|
||||
}
|
||||
|
||||
// 按配置走对应形态:laserPrefab 非空=预制体形态,为空=LineRenderer 兜底
|
||||
if (currentZhanShenData.laserPrefab != null)
|
||||
UpdateZhanShenLaserFx();
|
||||
else
|
||||
UpdateZhanShenLaserLine();
|
||||
}
|
||||
|
||||
/// <summary>隐藏全部战神激光(两种形态都处理)</summary>
|
||||
private void HideZhanShenLasers()
|
||||
{
|
||||
for (int i = 0; i < _zhanShenLasers.Count; i++)
|
||||
{
|
||||
if (_zhanShenLasers[i] != null && _zhanShenLasers[i].gameObject.activeSelf)
|
||||
_zhanShenLasers[i].gameObject.SetActive(false);
|
||||
}
|
||||
for (int i = 0; i < _laserFx.Count; i++)
|
||||
{
|
||||
if (_laserFx[i] != null && _laserFx[i].gameObject.activeSelf)
|
||||
_laserFx[i].gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 预制体形态(laserPrefab 非空):JiGuangControl 工具类驱动。
|
||||
/// 目标数量变化时全量重建(JiGuangCreate),每帧刷新位置/朝向/长度(JiGuangDirection/JiGuangLength,Z 强制 -50)。
|
||||
/// </summary>
|
||||
private void UpdateZhanShenLaserFx()
|
||||
{
|
||||
var zsData = currentZhanShenData;
|
||||
|
||||
// 起点:创建子弹的位置(Z=-50,战神激光显示层,和 FireBullet 的 startPos 同源仅 Z 不同)
|
||||
Vector3 startPos = GetBulletStartPos();
|
||||
startPos.z = -50f;
|
||||
|
||||
// 目标数量变化时全量重建(锁定建立/解除/三发目标增减时触发),并刷新基准缩放
|
||||
if (_laserFx.Count != _laserTargets.Count)
|
||||
{
|
||||
_laserFxBaseScale = zsData.laserPrefab.transform.localScale;
|
||||
JiGuangControl.JiGuangCreate(zsData.laserPrefab, startPos, _laserTargets, _laserFx, null, -50f);
|
||||
}
|
||||
|
||||
// 炮口随炮台旋转会移动,位置需每帧同步;隐藏中的重新激活
|
||||
for (int i = 0; i < _laserFx.Count; i++)
|
||||
{
|
||||
if (_laserFx[i] == null) continue;
|
||||
if (!_laserFx[i].gameObject.activeSelf)
|
||||
_laserFx[i].gameObject.SetActive(true);
|
||||
_laserFx[i].position = startPos;
|
||||
}
|
||||
|
||||
// 朝向 + 长度(指定 Z=-50 的重载:起终点同层)
|
||||
JiGuangControl.JiGuangDirection(startPos, _laserTargets, _laserFx, -50f);
|
||||
JiGuangControl.JiGuangLength(startPos, _laserTargets, _laserFx, _laserFxBaseScale, zsData.laserLengthCorrect, -50f);
|
||||
}
|
||||
|
||||
/// <summary>LineRenderer 兜底形态(laserPrefab 为空):按需创建、多余的隐藏</summary>
|
||||
private void UpdateZhanShenLaserLine()
|
||||
{
|
||||
// 起点:创建子弹的位置(Z=-50,战神激光显示层,和 FireBullet 的 startPos 同源仅 Z 不同)
|
||||
Vector3 start = GetBulletStartPos();
|
||||
start.z = -50f;
|
||||
@@ -303,53 +364,33 @@ public class SitPosData : MonoBehaviour
|
||||
private readonly List<Transform> _laserTargets = new List<Transform>();
|
||||
|
||||
/// <summary>
|
||||
/// 创建一条战神激光(第 index 条):
|
||||
/// - laserPrefab 非空 → 克隆预制体(LineRenderer 配置以预制体为准);
|
||||
/// - laserPrefab 为空 → 直接创建一个新 GameObject 并加上 LineRenderer(用 TurretData 上的宽度/颜色)。
|
||||
/// 创建一条 LineRenderer 形态的战神激光(第 index 条)。
|
||||
/// 仅 laserPrefab 为空时使用:直接创建一个新 GameObject 并加上 LineRenderer(用 TurretData 上的宽度/颜色)。
|
||||
/// </summary>
|
||||
private LineRenderer CreateZhanShenLaser(int index)
|
||||
{
|
||||
var zsData = currentZhanShenData;
|
||||
GameObject laserGo;
|
||||
LineRenderer line;
|
||||
|
||||
if (zsData.laserPrefab != null)
|
||||
{
|
||||
laserGo = Instantiate(zsData.laserPrefab);
|
||||
laserGo.name = $"ZhanShenLaser_{index}";
|
||||
line = laserGo.GetComponent<LineRenderer>();
|
||||
if (line == null)
|
||||
line = laserGo.AddComponent<LineRenderer>();
|
||||
}
|
||||
else
|
||||
{
|
||||
// ⭐ prefab 为空:直接新建对象 + LineRenderer
|
||||
laserGo = new GameObject($"ZhanShenLaser_{index}");
|
||||
line = laserGo.AddComponent<LineRenderer>();
|
||||
}
|
||||
|
||||
// 公共配置:两个端点
|
||||
GameObject laserGo = new GameObject($"ZhanShenLaser_{index}");
|
||||
LineRenderer line = laserGo.AddComponent<LineRenderer>();
|
||||
line.positionCount = Mathf.Max(line.positionCount, 2);
|
||||
laserGo.transform.SetParent(null); // 世界空间,不随座位/炮台旋转
|
||||
|
||||
if (zsData.laserPrefab == null)
|
||||
{
|
||||
// 自动创建时应用 TurretData 上的宽度/颜色/材质
|
||||
line.startWidth = zsData.laserWidth;
|
||||
line.endWidth = zsData.laserWidth;
|
||||
line.startColor = zsData.laserColor;
|
||||
line.endColor = zsData.laserColor;
|
||||
var shader = Shader.Find("Sprites/Default");
|
||||
if (shader != null)
|
||||
line.material = new Material(shader) { color = Color.white };
|
||||
line.useWorldSpace = true;
|
||||
}
|
||||
// 应用 TurretData 上的宽度/颜色/材质
|
||||
line.startWidth = zsData.laserWidth;
|
||||
line.endWidth = zsData.laserWidth;
|
||||
line.startColor = zsData.laserColor;
|
||||
line.endColor = zsData.laserColor;
|
||||
var shader = Shader.Find("Sprites/Default");
|
||||
if (shader != null)
|
||||
line.material = new Material(shader) { color = Color.white };
|
||||
line.useWorldSpace = true;
|
||||
|
||||
_zhanShenLasers.Add(line);
|
||||
return line;
|
||||
}
|
||||
|
||||
/// <summary>销毁所有战神激光对象(清战神/座位禁用时调用)</summary>
|
||||
/// <summary>销毁所有战神激光对象(两种形态都清,清战神/座位禁用时调用)</summary>
|
||||
private void DestroyZhanShenLaser()
|
||||
{
|
||||
for (int i = 0; i < _zhanShenLasers.Count; i++)
|
||||
@@ -358,6 +399,13 @@ public class SitPosData : MonoBehaviour
|
||||
Destroy(_zhanShenLasers[i].gameObject);
|
||||
}
|
||||
_zhanShenLasers.Clear();
|
||||
|
||||
for (int i = 0; i < _laserFx.Count; i++)
|
||||
{
|
||||
if (_laserFx[i] != null)
|
||||
Destroy(_laserFx[i].gameObject);
|
||||
}
|
||||
_laserFx.Clear();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -35,12 +35,14 @@ public class TurretData : MonoBehaviour
|
||||
public GameObject bulletPrefab;
|
||||
|
||||
[Header("战神激光(锁定时显示,普通炮台不配置即无此效果)")]
|
||||
[Tooltip("激光预制体(带 LineRenderer)。为空时自动创建一个 GameObject 并加 LineRenderer")]
|
||||
[Tooltip("激光预制体。非空=预制体形态(JiGuangControl 工具类驱动);为空=LineRenderer 兜底形态(自动创建)")]
|
||||
public GameObject laserPrefab;
|
||||
[Tooltip("自动创建激光时的线宽")]
|
||||
[Tooltip("LineRenderer 兜底形态的线宽")]
|
||||
public float laserWidth = 0.3f;
|
||||
[Tooltip("自动创建激光时的颜色")]
|
||||
[Tooltip("LineRenderer 兜底形态的颜色")]
|
||||
public Color laserColor = new Color(1f, 0.3f, 0.3f, 0.9f);
|
||||
[Tooltip("预制体形态激光的长度校正值(不同激光预制体设置不同值)")]
|
||||
public float laserLengthCorrect = 1f;
|
||||
|
||||
[Header("UI面板属性")]
|
||||
[Tooltip("炮台编号,对应 TurretResourcesData.turretNumber")]
|
||||
|
||||
Reference in New Issue
Block a user