做不出来
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
using Cielonos.MainGame.Effects;
|
||||
using Cielonos.MainGame.Effects.Feedback;
|
||||
using SLSUtilities.General;
|
||||
using Unity.Mathematics;
|
||||
@@ -31,7 +32,7 @@ namespace Cielonos.MainGame.Characters
|
||||
player.landMovementSc.TurnToDirection(direction, 0f);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(player.eventSm is PlayerEventSubmodule playerEventSm)
|
||||
{
|
||||
foreach(var action in playerEventSm.onDodgeAttempt.Values) action.Invoke(success);
|
||||
|
||||
@@ -40,10 +40,11 @@ namespace Cielonos.MainGame.Characters
|
||||
{
|
||||
backpackSm.ObtainItem<Polychrome>();
|
||||
backpackSm.ObtainItem<FutureWand>();
|
||||
backpackSm.ObtainItem<DualHarmony>();
|
||||
backpackSm.ObtainItem<Ascension>();
|
||||
backpackSm.ObtainItem<Passion>();
|
||||
backpackSm.ObtainItem<ThermalDetonator>();
|
||||
backpackSm.ObtainItem<SpatialWarpCaliper>();
|
||||
backpackSm.ObtainItem<PhotonWarper>();
|
||||
|
||||
foreach (MainWeaponBase mainWeapon in backpackSm.mainWeapons)
|
||||
{
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using Cielonos.MainGame;
|
||||
using Cielonos.MainGame.Buffs.Character;
|
||||
using Cielonos.MainGame.Effects.Feedback;
|
||||
using Cielonos.MainGame.UI;
|
||||
@@ -197,9 +198,34 @@ namespace Cielonos.MainGame.Characters
|
||||
|
||||
public override void RecoverEnergy(float energyAmount, bool spawnText = true)
|
||||
{
|
||||
if (energyAmount <= 0) return;
|
||||
if (Mathf.Abs(energyAmount) < 1e-5f) return;
|
||||
|
||||
AddEnergy(energyAmount);
|
||||
if (energyAmount > 0)
|
||||
{
|
||||
float current = attributeSm[CharacterAttribute.Energy];
|
||||
float max = attributeSm[CharacterAttribute.MaximumEnergy];
|
||||
float availableSpace = max - current;
|
||||
|
||||
if (energyAmount > availableSpace)
|
||||
{
|
||||
attributeSm[CharacterAttribute.Energy] = max;
|
||||
|
||||
float conversionRate =
|
||||
attributeSm.Has(CharacterAttribute.OverloadConversionRate) ?
|
||||
attributeSm[CharacterAttribute.OverloadConversionRate] : 1f;
|
||||
float overflowEnergy = (energyAmount - availableSpace) * conversionRate;
|
||||
DistributeOverloadEnergy(overflowEnergy);
|
||||
}
|
||||
else
|
||||
{
|
||||
attributeSm[CharacterAttribute.Energy] += energyAmount;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
attributeSm[CharacterAttribute.Energy] += energyAmount;
|
||||
attributeSm[CharacterAttribute.Energy] = Mathf.Max(0, attributeSm[CharacterAttribute.Energy]);
|
||||
}
|
||||
|
||||
if (spawnText)
|
||||
{
|
||||
|
||||
@@ -24,40 +24,7 @@ namespace Cielonos.MainGame.Characters
|
||||
RecoverEnergy(energyRegenRate, false);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 增减能量值,正值为增加(溢出部分按 OverloadConversionRate 转换为过载能量),负值为消耗。
|
||||
/// UI 更新和 onEnergyChanged 事件由属性值变更回调自动触发。
|
||||
/// </summary>
|
||||
public void AddEnergy(float amount)
|
||||
{
|
||||
if (amount == 0) return;
|
||||
|
||||
if (amount > 0)
|
||||
{
|
||||
float current = attributeSm[CharacterAttribute.Energy];
|
||||
float max = attributeSm[CharacterAttribute.MaximumEnergy];
|
||||
float availableSpace = max - current;
|
||||
|
||||
if (amount > availableSpace)
|
||||
{
|
||||
attributeSm[CharacterAttribute.Energy] = max;
|
||||
|
||||
float conversionRate = attributeSm.Has(CharacterAttribute.OverloadConversionRate) ? attributeSm[CharacterAttribute.OverloadConversionRate] : 1f;
|
||||
float overflowEnergy = (amount - availableSpace) * conversionRate;
|
||||
DistributeOverloadEnergy(overflowEnergy);
|
||||
}
|
||||
else
|
||||
{
|
||||
attributeSm[CharacterAttribute.Energy] += amount;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
attributeSm[CharacterAttribute.Energy] += amount;
|
||||
attributeSm[CharacterAttribute.Energy] = Mathf.Max(0, attributeSm[CharacterAttribute.Energy]);
|
||||
}
|
||||
}
|
||||
|
||||
private void DistributeOverloadEnergy(float totalOverflowAmount)
|
||||
{
|
||||
|
||||
@@ -8,6 +8,7 @@ using UnityEngine.UI;
|
||||
using SLSUtilities.General;
|
||||
using Unity.Cinemachine;
|
||||
using Ease = DG.Tweening.Ease;
|
||||
using Cielonos.MainGame.Effects.Feedback;
|
||||
|
||||
namespace Cielonos.MainGame.Characters
|
||||
{
|
||||
@@ -44,6 +45,7 @@ namespace Cielonos.MainGame.Characters
|
||||
// 用于存储独立的摄像机平滑旋转状态,防止跟随 Transform 的跳变
|
||||
private float currentYaw;
|
||||
private float currentPitch;
|
||||
private bool wasShakingLastFrame;
|
||||
|
||||
private Tweener iconTween;
|
||||
|
||||
@@ -117,9 +119,29 @@ namespace Cielonos.MainGame.Characters
|
||||
|
||||
// 【2】接管并强制控制 OrbitalFollow 的轨道位置
|
||||
var orbitalFollow = viewSc.lockingTargetCamera.GetComponent<CinemachineOrbitalFollow>();
|
||||
// 直接强制摄像机在水平和垂直轨道上移动
|
||||
orbitalFollow.HorizontalAxis.Value = currentYaw;
|
||||
orbitalFollow.VerticalAxis.Value = currentPitch;
|
||||
|
||||
float horizontalOffset = 0f;
|
||||
float verticalOffset = 0f;
|
||||
var orbitShaker = viewSc.lockingTargetCamera.GetComponent<CameraOrbitShaker>();
|
||||
bool isOrbitActive = orbitShaker != null && orbitShaker.enabled && orbitShaker.HasActiveShakes;
|
||||
|
||||
if (isOrbitActive)
|
||||
{
|
||||
horizontalOffset = orbitShaker.CurrentHorizontalOffset;
|
||||
verticalOffset = orbitShaker.CurrentVerticalOffset;
|
||||
wasShakingLastFrame = true;
|
||||
}
|
||||
else if (wasShakingLastFrame)
|
||||
{
|
||||
// 刚结束大招回旋的帧:将相机的最终物理轴值写入内部状态,防止数值突变
|
||||
currentYaw = orbitalFollow.HorizontalAxis.Value;
|
||||
currentPitch = orbitalFollow.VerticalAxis.Value;
|
||||
wasShakingLastFrame = false;
|
||||
}
|
||||
|
||||
// 直接强制摄像机在水平和垂直轨道上移动(包含大招/反馈的 Orbit 回旋偏差量)
|
||||
orbitalFollow.HorizontalAxis.Value = currentYaw + horizontalOffset;
|
||||
orbitalFollow.VerticalAxis.Value = currentPitch + verticalOffset;
|
||||
|
||||
float OF_Fade = camLockData.orbitalFollowFadeCurve.Evaluate(Mathf.Clamp01((horizontalDistance - camLockData.orbitalFollowFadeDistanceRange.x) /
|
||||
(camLockData.orbitalFollowFadeDistanceRange.y - camLockData.orbitalFollowFadeDistanceRange.x)));
|
||||
@@ -226,6 +248,7 @@ namespace Cielonos.MainGame.Characters
|
||||
this.isLocking = false;
|
||||
this.isAutoRotate = false;
|
||||
viewSc.stateDrivenCamera.GetComponent<Animator>().SetBool("isLockTarget", false);
|
||||
viewSc.currentCamera = viewSc.freeLookCamera; // 核心修复:更新当前相机引用为自由相机
|
||||
|
||||
Transform oldTargetPoint = targetPoint;
|
||||
this.lockTarget = null;
|
||||
|
||||
Reference in New Issue
Block a user