Files
Fishing2/Assets/Scripts/Fishing/New/View/FishingLine/FishingLineSolver.cs
2026-04-13 20:55:07 +08:00

114 lines
2.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
namespace NBF
{
public enum LineType
{
Hand,
HandDouble,
Spinning,
SpinningFloat,
}
public class FishingLineSolver : FGearBase
{
[SerializeField] public LineType LineType;
[Header("References")] [SerializeField]
private Transform anchorTransform;
[SerializeField] private FishingLineNode[] logicalNodes = Array.Empty<FishingLineNode>();
public JointPinchController PinchController;
#region LineNode
/// <summary>
/// 当前配置的逻辑节点只读列表。
/// 外部可读取节点顺序,但不应直接修改数组内容。
/// </summary>
public IReadOnlyList<FishingLineNode> LogicalNodes => logicalNodes;
/// <summary>
/// 获取指定顺序索引的逻辑节点。
/// 索引基于 logicalNodes 配置顺序;超出范围或节点为空时返回 null。
/// </summary>
public FishingLineNode GetLogicalNode(int logicalIndex)
{
if (logicalNodes == null || logicalIndex < 0 || logicalIndex >= logicalNodes.Length)
{
return null;
}
return logicalNodes[logicalIndex];
}
/// <summary>
/// 获取当前起点逻辑节点。
/// 会返回配置顺序中第一个非空节点。
/// </summary>
public FishingLineNode GetStartNode()
{
return FindFirstValidLogicalNode();
}
/// <summary>
/// 获取当前终点逻辑节点。
/// 会返回配置顺序中最后一个非空节点。
/// </summary>
public FishingLineNode GetEndNode()
{
return FindLastValidLogicalNode();
}
private FishingLineNode FindFirstValidLogicalNode()
{
if (logicalNodes == null)
{
return null;
}
for (var i = 0; i < logicalNodes.Length; i++)
{
if (logicalNodes[i] != null)
{
return logicalNodes[i];
}
}
return null;
}
private FishingLineNode FindLastValidLogicalNode()
{
if (logicalNodes == null)
{
return null;
}
for (var i = logicalNodes.Length - 1; i >= 0; i--)
{
if (logicalNodes[i] != null)
{
return logicalNodes[i];
}
}
return null;
}
#endregion
protected override void OnInit()
{
var tipRb = Rod.Asset.LineConnectorRigidbody;
anchorTransform = tipRb.transform;
}
}
}