Змея: выход из текстур, полёт на ПКМ; одержимый: приседание, удар по прицелу; коза
- Змея: проверка «внутри текстуры» лучами (земля игры - поверхность), каждый кадр выброс на ближайшее свободное место (на земле - из любых текстур, в полёте - из грунта); шаг и прыжок в текстуры не пускают. Полёт пока зажата ПКМ: 1.1 м/с (половина шага зомби), сквозь постройки можно, в грунт нельзя; Пробел вверх, C/Ctrl вниз. E - аварийный выход. Детализация зданий и область тела - как у одержимого. - Одержимый: будит спящих (комнаты зданий и сам вид одержимого), приседание на C и Ctrl, удар по точке под прицелом с наведением на грудь ближнего врага. - Хваты: толчок руки к прицелу на ЛКМ; «пиф-паф» вселяет на пике толчка. «Отрицание» стало «Козой» (13 языков): средний и безымянный поджаты, большой прижат; звук - бросок змеи. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
bb7a66dd8e
commit
fdd3782024
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user