tst
This commit is contained in:
@@ -2,54 +2,19 @@
|
||||
|
||||
public sealed partial class Dedugan
|
||||
{
|
||||
private float anotherPivot;
|
||||
private Vector3 pivotOffset;
|
||||
private void RotateCamera()
|
||||
{
|
||||
if ( Input.Keyboard.Pressed( "Q" ) )
|
||||
{
|
||||
anotherPivot = 40f;
|
||||
}
|
||||
|
||||
if ( Input.Keyboard.Pressed( "E" ) )
|
||||
{
|
||||
anotherPivot = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (RagdollController.Enabled)
|
||||
if ( RagdollController.Enabled )
|
||||
{
|
||||
var off = RagdollController.WorldRotation.Up * 20f - Camera.WorldRotation.Forward * 200f;
|
||||
Camera.WorldPosition = Vector3.Lerp(Camera.WorldPosition, RagdollController.WorldPosition + off, Time.Delta * 5f);
|
||||
Camera.LocalRotation = Rotation.Lerp(Camera.LocalRotation, EyeAngles.ToRotation(), Time.Delta * 2f);
|
||||
Camera.WorldPosition = Vector3.Lerp( Camera.WorldPosition, RagdollController.WorldPosition + off,
|
||||
Time.Delta * 5f );
|
||||
Camera.LocalRotation = Rotation.Lerp( Camera.LocalRotation, EyeAngles.ToRotation(), Time.Delta * 2f );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Camera.LocalRotation = EyeAngles.ToRotation();
|
||||
// var offset = CameraPivot.LocalPosition + CameraPivot.LocalRotation.Backward * CamOffsetX;
|
||||
// Camera.LocalPosition = offset * Camera.LocalRotation;
|
||||
|
||||
Camera.LocalRotation = EyeAngles.ToRotation();
|
||||
|
||||
|
||||
var localPitchOffset = Camera.LocalRotation.Down * MathF.Max( 0f, EyeAngles.pitch ) * 0.32f +
|
||||
Camera.LocalRotation.Backward * MathF.Max( 0f, EyeAngles.pitch ) * 0.7f +
|
||||
Camera.LocalRotation.Up * MathF.Min( 0f, EyeAngles.pitch ) * 0.5f +
|
||||
Camera.LocalRotation.Backward * MathF.Min( 0f, EyeAngles.pitch ) * 0.8f +
|
||||
Camera.LocalRotation.Right * -anotherPivot;
|
||||
|
||||
if ( InAds )
|
||||
{
|
||||
pivotOffset = CameraPivot.LocalRotation.Backward * CamOffsetX * 0.5f + CameraPivot.LocalRotation.Up * 8f;
|
||||
}
|
||||
else
|
||||
{
|
||||
pivotOffset = CameraPivot.LocalRotation.Backward * CamOffsetX;
|
||||
}
|
||||
|
||||
var offset = (CameraPivot.LocalPosition + pivotOffset ) * EyeAngles.ToRotation() + localPitchOffset;
|
||||
Camera.LocalPosition = offset;
|
||||
CameraPivot.WorldPosition = Eyes.WorldPosition;
|
||||
CameraPivot.LocalRotation = EyeAngles.ToRotation();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -214,15 +214,15 @@ public sealed partial class Dedugan : Component
|
||||
if ( weapon != null && !weapon.IsReloading )
|
||||
{
|
||||
weapon.StartReload();
|
||||
|
||||
|
||||
// Анимация перезарядки персонажа (скорость уже установлена в weapon.StartReload())
|
||||
// Дополнительно устанавливаем здесь на случай, если weapon.StartReload() не вызвался
|
||||
var weaponDef = weapon.GetWeaponDefinition();
|
||||
if ( weaponDef != null )
|
||||
{
|
||||
float reloadSpeed = weaponDef.ReloadTime > 0 ? 1f / weaponDef.ReloadTime : 1f;
|
||||
Renderer.Set( "b_reload", true );
|
||||
Renderer.Set( "speed_reload", reloadSpeed );
|
||||
|
||||
Reload( reloadSpeed );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -312,17 +312,11 @@ public sealed partial class Dedugan : Component
|
||||
{
|
||||
Renderer.Set( "b_attack", true );
|
||||
}
|
||||
|
||||
[Rpc.Broadcast]
|
||||
void Reload( float reloadSpeed )
|
||||
{
|
||||
Renderer.Set( "b_reload", true );
|
||||
Renderer.Set( "speed_reload", reloadSpeed );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// if ( !Network.IsOwner ) return;
|
||||
//
|
||||
// InAds = Input.Down( "Attack2" );
|
||||
//
|
||||
// if ( Input.Pressed( "Attack1" ) && _weapon != null )
|
||||
// {
|
||||
// _weapon.Attack();
|
||||
// Attack();
|
||||
// }
|
||||
// }
|
||||
//
|
||||
|
||||
@@ -13,9 +13,10 @@ public sealed partial class Dedugan : Component, IUseContext, Component.INetwork
|
||||
[Property] public SkinnedModelRenderer Renderer { get; set; }
|
||||
[Property] public GameObject Camera { get; set; }
|
||||
[Property] public GameObject CameraPivot { get; set; }
|
||||
[Property] public GameObject Eyes { get; set; }
|
||||
[Property] public GameObject InventoryUI { get; set; }
|
||||
|
||||
[Property] [Range( 1f, 200f, 1f )] public float CamOffsetX { get; set; }
|
||||
[Property] public Vector3 CamOffset { get; set; }
|
||||
[Property] [Range( 50f, 1200f, 10f )] public float WalkSpeed { get; set; } = 100f;
|
||||
[Property] [Range( 100f, 1500f, 20f )] public float RunSpeed { get; set; } = 300f;
|
||||
[Property] [Range( 25f, 1100f, 5f )] public float DuckSpeed { get; set; } = 50f;
|
||||
@@ -84,17 +85,15 @@ public sealed partial class Dedugan : Component, IUseContext, Component.INetwork
|
||||
|
||||
UpdateBodyRotation();
|
||||
|
||||
// Renderer.LocalRotation = Rotation.Slerp(Renderer.LocalRotation, Rotation.FromYaw(EyeAngles.yaw), Time.Delta * 5f);
|
||||
|
||||
Camera.LocalRotation = EyeAngles.ToRotation();
|
||||
var pivotOffset = CameraPivot.LocalRotation.Backward * CamOffsetX;
|
||||
var localPitchOffset = Camera.LocalRotation.Down * MathF.Max( 0f, EyeAngles.pitch ) * 0.32f +
|
||||
Camera.LocalRotation.Backward * MathF.Max( 0f, EyeAngles.pitch ) * 0.7f +
|
||||
Camera.LocalRotation.Up * MathF.Min( 0f, EyeAngles.pitch ) * 0.5f +
|
||||
Camera.LocalRotation.Backward * MathF.Min( 0f, EyeAngles.pitch ) * 0.8f;
|
||||
|
||||
var offset = (CameraPivot.LocalPosition + pivotOffset) * EyeAngles.ToRotation() + localPitchOffset;
|
||||
Camera.LocalPosition = offset;
|
||||
var pivotOffset = CameraPivot.LocalRotation.Right * CamOffset.y +
|
||||
CameraPivot.LocalRotation.Forward * CamOffset.x +
|
||||
CameraPivot.LocalRotation.Up * CamOffset.z;
|
||||
|
||||
var rotatedOffset = pivotOffset * EyeAngles.ToRotation();
|
||||
|
||||
Camera.WorldPosition = CameraPivot.WorldPosition + rotatedOffset;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,13 +128,25 @@ public sealed partial class Dedugan : Component, IUseContext, Component.INetwork
|
||||
|
||||
// Проверяем, нужно ли поворачивать тело
|
||||
bool shouldRotateBody = false;
|
||||
|
||||
|
||||
|
||||
if ( InAds )
|
||||
{
|
||||
// В режиме прицеливания - мертвая зона 85 градусов
|
||||
if ( angleDiff > 85f )
|
||||
if ( Controller.Velocity.Length > 10f )
|
||||
{
|
||||
shouldRotateBody = true;
|
||||
// При беге - центрируем тело (угол > 15°)
|
||||
if ( angleDiff > 15f )
|
||||
{
|
||||
shouldRotateBody = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// При стоянии - мертвая зона 85°
|
||||
if ( angleDiff > 85f )
|
||||
{
|
||||
shouldRotateBody = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@@ -73,6 +73,16 @@
|
||||
- Настройка происходит прямо в инстансе префаба
|
||||
- Компоненты добавляются автоматически
|
||||
|
||||
### 7. Логика вращения в ADS режиме
|
||||
- **При беге (velocity > 10)**: Тело центрируется при угле > 15° (как в обычном режиме)
|
||||
- **При стоянии на месте**: Мертвая зона 85° - тело поворачивается только при угле > 85°
|
||||
- **Синхронизация**: Логика работает одинаково для всех игроков
|
||||
|
||||
### 8. Синхронизация анимаций
|
||||
- **Перезарядка**: Анимации перезарядки синхронизированы по сети
|
||||
- **RPC вызовы**: StartReload и FinishReload используют [Rpc.Broadcast]
|
||||
- **Скорость анимации**: speed_reload параметр синхронизирован для всех игроков
|
||||
|
||||
## Практическое использование
|
||||
|
||||
### 1. Создание оружия в редакторе
|
||||
|
||||
Reference in New Issue
Block a user