Змея: выход из текстур, полёт на ПКМ; одержимый: приседание, удар по прицелу; коза

- Змея: проверка «внутри текстуры» лучами (земля игры - поверхность), каждый кадр выброс
  на ближайшее свободное место (на земле - из любых текстур, в полёте - из грунта);
  шаг и прыжок в текстуры не пускают. Полёт пока зажата ПКМ: 1.1 м/с (половина шага
  зомби), сквозь постройки можно, в грунт нельзя; Пробел вверх, C/Ctrl вниз.
  E - аварийный выход. Детализация зданий и область тела - как у одержимого.
- Одержимый: будит спящих (комнаты зданий и сам вид одержимого), приседание на C и Ctrl,
  удар по точке под прицелом с наведением на грудь ближнего врага.
- Хваты: толчок руки к прицелу на ЛКМ; «пиф-паф» вселяет на пике толчка.
  «Отрицание» стало «Козой» (13 языков): средний и безымянный поджаты, большой прижат;
  звук - бросок змеи.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-10-05 16:28:40 +03:00
co-authored by Claude Opus 5.5
parent bb7a66dd8e
commit fdd3782024
6 changed files with 429 additions and 60 deletions
+53 -6
View File
@@ -88,6 +88,7 @@ namespace NecromancerTome
Enabled = false;
Overrides.Clear();
CamOverrides.Clear();
_jabStart = -1f;
Unfreeze();
_bones.Clear();
_rig = null;
@@ -159,7 +160,8 @@ namespace NecromancerTome
b.localRotation = Quaternion.Euler(kv.Value);
}
}
Transform cam = CamOverrides.Count > 0 ? Camera() : null;
Transform cam = CamOverrides.Count > 0 || _jabStart >= 0f ? Camera() : null;
ApplyJab(cam);
if (cam != null)
{
foreach (var kv in CamOverrides)
@@ -173,6 +175,43 @@ namespace NecromancerTome
}
}
/// <summary>Толчок руки к прицелу (указание 05.10, «пиф-паф» на ЛКМ: «чуть сдвигает руку в сторону
/// прицела и возвращает»). Плечо доворачивается так, чтобы кисть прошла JabAmount пути до линии
/// взгляда и вернулась - по синусу за JabTime. Ставится до CamOverrides: кисть сохраняет поворот
/// относительно камеры, сдвигается только её место.</summary>
public const float JabTime = 0.25f;
public const float JabAmount = 0.35f;
static float _jabStart = -1f;
public static void Jab()
{
_jabStart = Time.time;
}
static void ApplyJab(Transform _cam)
{
if (_jabStart < 0f)
{
return;
}
float t = (Time.time - _jabStart) / JabTime;
if (t >= 1f)
{
_jabStart = -1f;
return;
}
Transform arm = Bone("RightArm");
Transform hand = Bone("RightHand");
if (_cam == null || arm == null || hand == null)
{
return;
}
Vector3 toHand = hand.position - arm.position;
Vector3 aim = _cam.position + _cam.forward * Vector3.Dot(hand.position - _cam.position, _cam.forward);
Quaternion full = Quaternion.FromToRotation(toHand, aim - arm.position);
arm.rotation = Quaternion.Slerp(Quaternion.identity, full, Mathf.Sin(t * Mathf.PI) * JabAmount) * arm.rotation;
}
/// <summary>Кисть в осях камеры. Оси кисти правой руки (лог necrobones 03.10): пальцы - локальная +X
/// (суставы пальцев лежат по +X), ладонь - +Y (сгиб пальцев +Z ведёт +X к +Y), +Z - к мизинцу,
/// большой палец - к -Z. Нулевая поза: пальцы вверх, ладонь от игрока, тыльная сторона к камере,
@@ -221,8 +260,9 @@ namespace NecromancerTome
Overrides["LeftArm"] = new Vector3(30f, 13.6f, 57.3f);
}
/// <summary>Хват «отрицание» (утверждён пользователем 03.10): рука вперёд, как у браслета, ниже прицела,
/// кисть в линию с предплечьем, пальцы раскрыты.</summary>
/// <summary>Хват «коза» (до 05.10 - «отрицание»; утверждён пользователем 03.10): рука вперёд, как у браслета, ниже прицела,
/// кисть в линию с предплечьем, пальцы раскрыты. 05.10: средний и безымянный поджаты, как в кулаке
/// (сгиб - как у поджатых пальцев «пиф-пафа»), указательный и мизинец прямые.</summary>
public static void PresetDeny()
{
Overrides.Clear();
@@ -232,9 +272,16 @@ namespace NecromancerTome
Overrides["RightForeArm"] = new Vector3(0f, 88.4f, 0f);
Overrides["RightHand"] = new Vector3(45f, 0f, 0f);
SetFingers("Right", 3f, 12f);
Overrides["RightHandThumb1"] = new Vector3(55f, 68.6f, 40.6f);
Overrides["RightHandThumb2"] = new Vector3(0f, 0f, 0f);
Overrides["RightHandThumb3"] = new Vector3(0f, 0f, 0f);
for (int j = 1; j <= 3; j++)
{
float curl = j == 3 ? 55f : 80f;
Overrides["RightHandMiddle" + j] = new Vector3(0f, 0f, curl);
Overrides["RightHandRing" + j] = new Vector3(0f, 0f, curl);
}
// Большой палец прижимает поджатые (05.10: «полноценная коза»). Подбор на глаз - уточнять necropose.
Overrides["RightHandThumb1"] = new Vector3(55f, 68.6f, 75f);
Overrides["RightHandThumb2"] = new Vector3(0f, 0f, 40f);
Overrides["RightHandThumb3"] = new Vector3(0f, 0f, 30f);
LeftArmDown();
Unfreeze();
Enabled = true;