Files
Fishing2/Assets/Scripts/FloatBobberControllerBack.cs
2025-11-26 14:28:55 +08:00

298 lines
9.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// using UnityEngine;
//
// public class FloatBobberController : MonoBehaviour
// {
// [Header("Water System")]
// public bool useKWS = false;
// public LayerMask waterLayer;
// public float waterRaycastHeight = 10f;
//
// [Header("Spring Physics")]
// public float stiffness = 0.35f; // 弹性力度
// public float damping = 0.82f; // 阻尼
// public float noiseStrength = 0.02f; // 自然颤动
//
// [Header("Tilt")]
// public Transform lineAttachPoint; // 钓线连接点(让漂倾斜)
// public float tiltStrength = 6f;
//
// private float targetOffsetY = 0f;
// private float offsetY = 0f;
// private float velocity = 0f;
//
// private float baseWaterHeight = 0f;
//
// // 随机噪声 seed
// private float noiseSeed;
//
// void Start()
// {
// noiseSeed = Random.value * 100f;
// }
//
// void Update()
// {
// UpdateWaterHeight();
// UpdateSpringPhysics();
// UpdateTilt();
// ApplyFinalPosition();
// }
//
// // -----------------------------------------------------------
// // 1. 水面高度获取 (支持 KWS 或 Raycast)
// // -----------------------------------------------------------
// void UpdateWaterHeight()
// {
// if (useKWS)
// {
// // ⭐ 你自己替换为 KWS 的 API
// baseWaterHeight = SampleWaterHeight_KWS();
// }
// else
// {
// // 简单射线获取水面高度
// Vector3 start = transform.position + Vector3.up * waterRaycastHeight;
// if (Physics.Raycast(start, Vector3.down, out RaycastHit hit, 50f, waterLayer))
// {
// baseWaterHeight = hit.point.y;
// }
// }
// }
//
// float SampleWaterHeight_KWS()
// {
// // ❗你需要替换成你的 KWS 接口,比如:
// // return KWS.GetWaterHeight(transform.position);
// return transform.position.y; // 临时占位
// }
//
// // -----------------------------------------------------------
// // 2. 弹簧-阻尼伪物理 (核心)
// // -----------------------------------------------------------
// void UpdateSpringPhysics()
// {
// // 弹簧吸附:朝向 targetOffsetY
// velocity += (targetOffsetY - offsetY) * stiffness;
//
// // 阻尼
// velocity *= damping;
//
// // 移动
// offsetY += velocity;
//
// // 自然轻微噪声
// float noise = (Mathf.PerlinNoise(Time.time * 1.2f, noiseSeed) - 0.5f) * noiseStrength;
// offsetY += noise;
// }
//
// // -----------------------------------------------------------
// // 3. 漂倾斜(依据钓线方向)
// // -----------------------------------------------------------
// void UpdateTilt()
// {
// if (lineAttachPoint == null) return;
//
// Vector3 dir = lineAttachPoint.position - transform.position;
// if (dir.magnitude > 0.001f)
// {
// Quaternion targetRot = Quaternion.LookRotation(dir, Vector3.up);
// transform.rotation = Quaternion.Slerp(transform.rotation, targetRot, Time.deltaTime * tiltStrength);
// }
// }
//
// // -----------------------------------------------------------
// // 4. 应用最终位置
// // -----------------------------------------------------------
// void ApplyFinalPosition()
// {
// Vector3 pos = transform.position;
// pos.y = baseWaterHeight + offsetY;
// transform.position = pos;
// }
//
// // ============================ 触发动作 API ============================
//
// /// <summary>小顿口:轻微上升 0.51.5 目</summary>
// public void TriggerSmallDonk()
// {
// targetOffsetY = Random.Range(0.3f, 0.9f);
// stiffness = 0.40f;
// damping = 0.82f;
// }
//
// /// <summary>顿口:快速上升,并轻微过冲</summary>
// public void TriggerDonk()
// {
// targetOffsetY = Random.Range(1.0f, 1.8f);
// stiffness = 0.55f;
// damping = 0.78f;
// }
//
// /// <summary>顶漂:慢慢上浮几目</summary>
// public void TriggerTopLift()
// {
// targetOffsetY = Random.Range(1.0f, 3.0f);
// stiffness = 0.18f;
// damping = 0.90f;
// }
//
// /// <summary>黑漂:快速下沉,并保持</summary>
// public void TriggerBlackSink()
// {
// targetOffsetY = Random.Range(-3.0f, -6.0f);
// stiffness = 0.45f;
// damping = 0.75f;
// }
//
// /// <summary>点动:轻微上下动</summary>
// public void TriggerNibble()
// {
// targetOffsetY = Mathf.Sin(Time.time * Random.Range(6f, 12f)) * 0.1f;
// stiffness = 0.25f;
// damping = 0.88f;
// }
//
// /// <summary>走漂(水层有流料或者风),水平漂移你用其他脚本控制即可</summary>
// public void TriggerDrift(float amount)
// {
// targetOffsetY = 0f;
// offsetY = 0f;
// }
//
// /// <summary>恢复到 Idle 状态</summary>
// public void ResetIdle()
// {
// targetOffsetY = 0f;
// stiffness = 0.35f;
// damping = 0.85f;
// }
// }
//
//
// using UnityEngine;
//
// public class FloatBobberControllerPro : MonoBehaviour
// {
// [Header("Water Settings")] public float waterLevel = 0f; // 水面高度世界坐标
// public float waterDensity = 1f; // 水密度默认1即可
//
// [Header("Bobber Physical Settings")] public float bobberVolume = 30f; // 浮漂最大浮力cm³
// public float bobberMass = 1f; // 浮漂自身重量(克)
//
// [Header("Tackle Weight Settings")] public float sinkerWeight = 2f; // 铅坠重量(克)
// public float baitWeight = 0.5f; // 鱼饵重量(克)
// public float hookWeight = 0.2f; // 鱼钩重量(克)
//
// [Header("Physics Behaviour")] public float riseSpeed = 1.2f; // 浮漂上浮速度
// public float fallSpeed = 1.5f; // 浮漂下沉速度
// public float smoothDamping = 8f; // 插值平滑
//
// [Header("Random Water Movements")] public float noiseAmplitude = 0.02f; // 微扰幅度
// public float noiseFrequency = 1f; // 微扰频率
//
// float velocity = 0f;
// float timeNoise = 0f;
//
// // 用于顿口、顶漂脉冲
// float impulseForce = 0f;
// float impulseDecay = 4f;
//
// void Update()
// {
// SimulateBobberPhysics();
// }
//
// void SimulateBobberPhysics()
// {
// float totalDownwardWeight = bobberMass + sinkerWeight + baitWeight + hookWeight;
//
// float maxBuoyancy = bobberVolume; // 最大浮力 = 体积
// float netBuoyancy = maxBuoyancy - totalDownwardWeight;
//
// float targetY;
//
// // -------------------------
// // 1. 判断浮漂应该沉多少(吃水深度)
// // -------------------------
// if (netBuoyancy > 0)
// {
// float buoyPercent = Mathf.Clamp01(netBuoyancy / maxBuoyancy);
// float rise = buoyPercent * 0.1f; // 浮漂露出水面的高度
//
// targetY = waterLevel + rise;
//
// targetY += Mathf.Sin(Time.time * noiseFrequency) * noiseAmplitude; // 微扰模拟波浪
// }
// else
// {
// // 净浮力为负 → 说明浮漂整体被拉下,沉入水中
// float sinkDistance = Mathf.Abs(netBuoyancy) * 0.03f;
// targetY = waterLevel - sinkDistance;
// }
//
// // -------------------------
// // 2. 顶漂 & 顿口 脉冲
// // -------------------------
// if (impulseForce != 0f)
// {
// targetY += impulseForce * Time.deltaTime;
// impulseForce = Mathf.Lerp(impulseForce, 0f, Time.deltaTime * impulseDecay);
// }
//
// // -------------------------
// // 3. 平滑过渡到目标位置(核心)
// // -------------------------
// float currentY = transform.position.y;
//
// float newY = Mathf.Lerp(
// currentY,
// targetY,
// Time.deltaTime * smoothDamping
// );
//
// transform.position = new Vector3(
// transform.position.x,
// newY,
// transform.position.z
// );
// }
//
// // ===========================
// // 外部函数:模拟钓鱼动作
// // ===========================
//
// /// <summary>
// /// 顿口:浮漂瞬间被向下拉一下(鱼轻轻吸饵)
// /// </summary>
// public void TriggerDownPulse(float strength = 0.8f)
// {
// impulseForce -= Mathf.Abs(strength);
// }
//
// /// <summary>
// /// 顶漂:浮漂瞬间向上冒一下(鱼儿托饵)
// /// </summary>
// public void TriggerUpPulse(float strength = 0.8f)
// {
// impulseForce += Mathf.Abs(strength);
// }
//
// /// <summary>
// /// 模拟鱼儿吃饵 → 增加下拉力
// /// </summary>
// public void AddFishPull(float value)
// {
// sinkerWeight += value;
// }
//
// /// <summary>
// /// 模拟脱钩 → 拉力消失
// /// </summary>
// public void RemoveFishPull(float value)
// {
// sinkerWeight -= value;
// }
// }