Крепление emitor над ником?

  • Автор темы Автор темы BIT_hack
  • Дата начала Дата начала

BIT_hack

Знающий
Участник
Сообщения
254
Розыгрыши
0
Решения
2
Репутация
79
Реакции
158
Баллы
485
Когда-то я устанавливал Emitor над ником или над костью головы — сейчас уже не помню точно. Но сейчас я не могу вспомнить, как это сделать, а в интернете не могу найти нужную информацию, хотя раньше она была доступна. Если кто-то знает, как это сделать, пожалуйста, подскажите!

Сейчас креплю по фиксированным координатам StartLocationOffset=(Z=45)
Код:
defaultproperties
{
 // Эффект над головой
    Begin Object Class=SpriteEmitter Name=SpriteEmitterHead
        FadeOutStartTime=2.46
        FadeOut=true
        MaxParticles=1
        StartLocationOffset=(Z=45)
        SpinParticles=true
        SpinCCWorCW=(Y=1)
        UseSizeScale=true
        UseRegularSizeScale=false
        UniformSize=true
        StartSizeRange=(X=(Min=50,Max=50),Y=(Min=50,Max=50),Z=(Min=50,Max=50))
        InitialParticlesPerSecond=10
        AutomaticInitialSpawning=true
        LifetimeRange=(Min=1.0,Max=1.5)
        Name="SpriteEmitterHead"
    End Object
    Emitters(1)=SpriteEmitterHead
    bRotEmitter=true
    bUnlit=false
    bDirectional=true        
    bLightChanged=true
    bNoDelete=false
}
1733308418576.webp
 
Обвел красным
1733326066199.webp
 

Спасибо сделал пока так работает, если вспомню как делал раньше выложу.
C++:
    MyEmitter.Emitters[2].StartLocationOffset.Z = TargetActor.CollisionHeight+Pawn(TargetActor).NameOffset+25;
 
Я думаю этого достаточно

C++:
foreach MyActor.CollidingActors(class'Actor', TargetActor, 1, info.Loc) {

    MyEmitter = TargetActor.Spawn(class'BIT_TargetEffect', TargetActor, , info.Loc, rot(0, 0, 0));
    MyEmitter.SetBase(TargetActor);
    MyEmitter.Emitters[0].Disabled = true;
    MyEmitter.Emitters[0].Texture = TargetTexture;
    MyEmitter.Emitters[0].AutoDestroy = true;
    MyEmitter.Emitters[0].StartLocationOffset.Z = TargetActor.CollisionRadius * 10;


    MyEmitter.Emitters[1].Texture = LogoTexture;
    MyEmitter.Emitters[1].StartLocationOffset.Z = TargetActor.CollisionHeight+20;


    MyEmitter.Emitters[2].Texture =Texture(DynamicLoadObject("LineageEffectsTextures.Particles3.fx_m_t4030", class'Texture'));



    MyEmitter.Emitters[2].StartLocationOffset.Z = Pawn(TargetActor).NameOffset;

    return;
    }
Так естественно у вас не так как в моем примере, не даром я сказал непонятно как у вас сделано, у вас перебор всех Акторов, которые коснулись вашего Актора, в указанной вами области, таким образом у вас может быть и не класс NPC это во первых, соответственно NameOffset Будет пустой, и во вторых он будет крепиться к позиции этого объекта, но этого может конечно и не быть. Во вторых вы используйте позицию от вашего актора для установки/вызова эффекта, а должны для того объекта которого коснулись(т.е NPC , т.е так - MyEmitter = TargetActor.Spawn(class'BIT_TargetEffect', TargetActor, , TargetActor.Location, rot(0, 0, 0)); ) , далее вы устанавливайте базу, но не добавляйте смешение как я показал(т.е вместо MyEmitter.SetBase(TargetActor); , вот так MyEmitter.SetBase(TargetActor,vect(0.00,0.00,Pawn(TargetActor).NameOffset)); .
Дальше вы зачем то используйте StartLocationOffset для установки смешения , не знаю зачем вы это сделали, но это как минимум не правильно поскольку во первых StartLocationOffset может быть не значением относительно объекта(который вам нужен),(точно не скажу),во вторых вы не добавляйте Значение Позиции вашего объекта + со значением смещения имени (т.е вот так MyEmitter.Emitters[2].StartLocationOffset.Z = TargetActor.Location.Z+Pawn(TargetActor).NameOffset; ) . //( Если что TargetActor.Location это опять таки стандартная позиция кости Bip01 )
Это как минимум, но вообще если хотите как и выше предложили можно добавить эффект не к стандартной кости bip01, а к головной bip01_head, и сместить как вам нужно, т.е вот так.
TargetActor.AttachToBone(MyEmitter,'Bip01_head'); / либо TargetActor.AttachToBone(MyEmitter,HeadBone);
MyEmitter.SetRelativeLocation(vect(0,0,Pawn(TargetActor).NameOffset)); - Так на 99% сработает .
 
Так естественно у вас не так как в моем примере, не даром я сказал непонятно как у вас сделано, у вас перебор всех Акторов, которые коснулись вашего Актора, в указанной вами области, таким образом у вас может быть и не класс NPC это во первых, соответственно NameOffset Будет пустой, и во вторых он будет крепиться к позиции этого объекта, но этого может конечно и не быть. Во вторых вы используйте позицию от вашего актора для установки/вызова эффекта, а должны для того объекта которого коснулись(т.е NPC , т.е так - MyEmitter = TargetActor.Spawn(class'BIT_TargetEffect', TargetActor, , TargetActor.Location, rot(0, 0, 0)); ) , далее вы устанавливайте базу, но не добавляйте смешение как я показал(т.е вместо MyEmitter.SetBase(TargetActor); , вот так MyEmitter.SetBase(TargetActor,vect(0.00,0.00,Pawn(TargetActor).NameOffset)); .
Дальше вы зачем то используйте StartLocationOffset для установки смешения , не знаю зачем вы это сделали, но это как минимум не правильно поскольку во первых StartLocationOffset может быть не значением относительно объекта(который вам нужен),(точно не скажу),во вторых вы не добавляйте Значение Позиции вашего объекта + со значением смещения имени (т.е вот так MyEmitter.Emitters[2].StartLocationOffset.Z = TargetActor.Location.Z+Pawn(TargetActor).NameOffset; ) . //( Если что TargetActor.Location это опять таки стандартная позиция кости Bip01 )
Это как минимум, но вообще если хотите как и выше предложили можно добавить эффект не к стандартной кости bip01, а к головной bip01_head, и сместить как вам нужно, т.е вот так.
TargetActor.AttachToBone(MyEmitter,'Bip01_head'); / либо TargetActor.AttachToBone(MyEmitter,HeadBone);
MyEmitter.SetRelativeLocation(vect(0,0,Pawn(TargetActor).NameOffset)); - Так на 99% сработает .
GetTargetInfo(info);
 
Дальше вы зачем то используйте StartLocationOffset для установки смешения , не знаю зачем вы это сделали, но это как минимум не правильно поскольку во первых StartLocationOffset может быть не значением относительно объекта(который вам нужен),(точно не скажу),во вторых вы не добавляйте Значение
Там 3 эффекта 1 подсветка моба и остальные эффект над головой
 
Там 3 эффекта 1 подсветка моба и остальные эффект над головой
Там 3 эмиттера , а не эффекта, в адекватном мире нужно выносить все в отдельные эффекты и использовать стандарт, и не играться так .
В Любом случае рабочий вариант без непонятно какой коллизии и непонятных значений я вам дал.
 
Там 3 эмиттера , а не эффекта, в адекватном мире нужно выносить все в отдельные эффекты и использовать стандарт, и не играться так .
В Любом случае рабочий вариант без непонятно какой коллизии и непонятных значений я вам дал.
Возможно, вы считаете, что создавать множество классов с эмиттерами и массивами — это нормальное решение. Я не уверен, но я использую один класс, в котором уже реализован как я понимаю динамический массивы с эмиттерами в моем случае этого достаточно!
C++:
var Emitter MyEmitter;
 
Там 3 эмиттера , а не эффекта, в адекватном мире нужно выносить все в отдельные эффекты и использовать стандарт, и не играться так .
В Любом случае рабочий вариант без непонятно какой коллизии и непонятных значений я вам дал.
Я буду разбираться с этим! еще вопрос я задавал выше как перевернуть эмиттер на 180 граусов что бы картинка была правильно расположена так как я ее загрузил в игру а не верх ногами)

это не помогает текстура больше не поворачивается к камере

// UseDirectionAs = PTDU_Normal //Покажем текстуру как есть
// RealProjectionNormal = (Y=1.000000) //Поворот для спрайта
 
Код:
    Begin Object Class=SpriteEmitter Name=SpriteEmitter1   
        UseDirectionAs=PTDU_Up
        Acceleration=(Z=0.004)
        MaxParticles=1
        UseRegularSizeScale=false
        UseSizeScale = true
        ZTest=False   
        UniformSize = false
        SizeScale(0)=(RelativeSize=0.03478)
        SizeScale(1)=(RelativeTime=2.000000,RelativeSize=0.03478)
        InitialParticlesPerSecond=1.000000
        AutomaticInitialSpawning=False
        DrawStyle=PTDS_AlphaBlend//PTDS_Regular//PTDS_AlphaBlend
        Texture=None
        LifetimeRange=(Min=10.000000,Max=10.000000)
        FadeOutStartTime=9.8000
        FadeOut=True
        RespawnDeadParticles=False
        WarmupTicksPerSecond=100.000000
        RelativeWarmupTime=0.9750
        Name="SpriteEmitter1"
    End Object
    Emitters(1)=SpriteEmitter'SpriteEmitter1'
 
я как то так делал, через небольшое ускорение по Z, по-другому вроде не выходило
 
Ну у меня эффект с иконками дебаффов именно так работал
 
Ну у меня эффект с иконками дебаффов именно так работал
Я брал твой код у меня почему то он не правильно работал я тогда тебе и писал так и не смог твой код приспособить сделал новый а недавно не знаю зачем удалил проект в котором все было реализовано(
 
Возможно, вы считаете, что создавать множество классов с эмиттерами и массивами — это нормальное решение. Я не уверен, но я использую один класс, в котором уже реализован как я понимаю динамический массивы с эмиттерами в моем случае этого достаточно!
C++:
var Emitter MyEmitter;
Это стандарт, можете посмотреть в другом классе LineageMonster.antaras это реализовано, удобно и понятно( 1 Класс 2 Переменные и 2 Эмиттера Актора ) , а у вас костыль, кривой( у вас именно 3 эмиттера, которые должны быть отдельно объявлены, каждый со своей текстурой и вызваны и установлены на объект используя свои отдельные координаты (как по стандарту), ибо вам это надо , вы не Эффект делайте(т.е совокупность эмиттеров, образующих задуманный концепт художником эффект ), а просто 2 или 3 "светящейся/двигающийся" при желании текстуры для разных частей объекта(монстра или нпц без разницы, у них разные точки крепления)- это как раз эмиттер и называется, но не Эффект,то что это Эмиттер Актора имеет внутри себя Массив Эмиттеров(разного типа - Sprite, Mesh,...) не делает из них Эффект, никак это не стандарт и не задумывалось так использоваться, со всеми вытекающими что у вас якобы не получается (при желании то что вы сделали можно и в саму модель вбить в виде нового слоя модели) и не удобный в понимании для кого-то кроме вас, т.е это не масштабируемо.
 
Ну у меня эффект с иконками дебаффов именно так работал
Я ещё раз проверил твой код, немного его настроил, и всё заработало!
Странно, что в прошлый раз у меня не получалось!
Спасибо!
 
Назад
Сверху Снизу