Урна-цинерарий: своя модель, свечение по черепу, кровь в рецепте

Модель (бандл necrocinerarium, BlenderWork/necroCinerarium/make_urn.py):
тело вращения в чёрной глазури, по четырём сторонам - вдавленные лицевые
части черепа, наклонённые вниз; руны старшего футарка кровью «SERVU ĜIS
LA LASTA CINDRO» («Служи до последнего пепла»), меандр на ножке, бусины на
шейке, пояс черепов в двух линиях. Руны тлеют красным, глазницы светятся
фиолетовым, только когда в урне череп (_EmissionColor через
MaterialPropertyBlock). Своя иконка. Коллайдер-тег - DecorColliderTagPatch.
Дух: выше на 10 см и на 7 см вперёд в своей системе (хвост не вылезает
сзади), necrogenie fwd. Рецепт: + кровь некроманта, копия на соке розы.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-10-16 17:37:13 +03:00
co-authored by Claude Opus 5.5
parent 94bf0a5f5c
commit 9f813bb699
8 changed files with 63 additions and 11 deletions
+32
View File
@@ -245,6 +245,7 @@ namespace NecromancerTome
/// <summary>_sound - череп только что положили или вынули (порыв); при загрузке чанка дух появляется молча.</summary>
public void SyncGenie(bool _sound)
{
SyncGlow();
if (HasSkull && _genie == null)
{
_genie = CinerariumGenie.Spawn(ModelTransform());
@@ -259,6 +260,37 @@ namespace NecromancerTome
}
}
/// <summary>Руны кровью и глазницы черепов светятся, только когда в урне череп (16.10): _EmissionColor через
/// MaterialPropertyBlock на рендерерах модели урны (материал общий не трогается), духа не задевает.</summary>
public static Color GlowColor = new Color(2.2f, 2.2f, 2.2f, 1f);
static readonly MaterialPropertyBlock _glowBlock = new MaterialPropertyBlock();
static readonly int EmissionColorId = Shader.PropertyToID("_EmissionColor");
int _glowState = -1; // -1 - не ставили на эту модель
void SyncGlow()
{
Transform t = ModelTransform();
int want = HasSkull ? 1 : 0;
if (t == null || (_glowState == want && _glowModel == t))
{
return;
}
foreach (Renderer r in t.GetComponentsInChildren<Renderer>(true))
{
if (_genie != null && r.transform.IsChildOf(_genie.transform) || _bounds != null && r.transform.IsChildOf(_bounds.transform))
{
continue;
}
r.GetPropertyBlock(_glowBlock);
_glowBlock.SetColor(EmissionColorId, HasSkull ? GlowColor : Color.black);
r.SetPropertyBlock(_glowBlock);
}
_glowState = want;
_glowModel = t;
}
Transform _glowModel;
void RemoveGenie(bool _sound)
{
if (_genie == null)