Всем привет, я заметил что некоторые люди не до конца понимают что такое регистрация анимаций для предметов в руках, как ее правильно делать и для чего она нужна?
Для чего это нужно? Допустим вы добавляете предмет в игру и не привязываете его ни к какому объекту (создаете полностью с нуля, задаете свойства) и сталкиваетесь с тем что ваш объект без привязки не имеет должной анимации. А имеет стандартную анимацию банки консервы (в том числе и для предметов которые должны держаться в 2 руках), ну или вовсе предмет находиться в ногах у персонажа (примеры прикрепил скриншоты). Именно для этого и нужно привязывать анимацию положения объекта в руках через скрипт.
На момент написания этого поста я знаю 3 вида регистрации анимаций для предметов в руках:
1. PlayerBase
2. JMAnimRegister
3. ModItemRegisterCallbacks
До создания последних 2 способов все использовали PlayerBase :
modded class PlayerBase
{
override void Init()
{
DayzPlayerItemBehaviorCfg fireArmsItemBehaviour = new DayzPlayerItemBehaviorCfg;
fireArmsItemBehaviour.SetFirearms();
GetDayZPlayerType().AddItemInHandsProfileIK("MyModdedWeapon", "dz/anims/workspaces/player/player_main/weapons/player_main_cz527.asi", fireArmsItemBehaviour, "dz/anims/anm/player/ik/weapons/cz527.anm", "dz/anims/anm/player/reloads/cz527/w_CZ527_states.anm");
super.Init();
}
}
Но у этого способа есть очень большой минус, это очень нестабильная штука. Нередко крашила сервера и имела ограничения на кол-во регистрации анимаций.
С такими большими минусами, мододеллы начали искать решения как можно сделать это более стабильно и оптимизированно. И такой способ нашли.
DayZPlayerTypeRegisterItems(DayZPlayerType Type) вот наше спасение, но тут тоже не все так просто, полумолчание это функция внутри класса, а для поставленной задачи (иметь возможность безопасно и стабильно вносить новую регистрацию предметов) это не подходит. Тогда разработчики мода CF создали кастомный класс с использованием схожих функций для регистрации анимаций положений предметов в руках. Этим классом является JMAnimRegister. Стабильная и оптимизированная функция, которой очень просто пользоваться. Разумеется использовать вы сможете этот класс только при наличии в своей сборке CF . Как им пользоваться?
modded class JMAnimRegister
{
override void OnRegisterFireArms( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior )
{
super.OnRegisterFireArms( pType, pBehavior );
pType..AddItemInHandsProfileIK("MyModdedWeapon", "dz/anims/workspaces/player/player_main/weapons/player_main_cz527.asi", pBehavior, "dz/anims/anm/player/ik/weapons/cz527.anm", "dz/anims/anm/player/reloads/cz527/w_CZ527_states.anm");
}
};
Как самый простой пример. И так можно задавать любому количеству предметов положение в руках :
modded class JMAnimRegister
{
override void OnRegisterFireArms( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior )
{
super.OnRegisterFireArms( pType, pBehavior );
pType..AddItemInHandsProfileIK("MyModdedWeapon", "dz/anims/workspaces/player/player_main/weapons/player_main_cz527.asi", pBehavior, "dz/anims/anm/player/ik/weapons/cz527.anm", "dz/anims/anm/player/reloads/cz527/w_CZ527_states.anm");
pType..AddItemInHandsProfileIK("MyModdedWeapon2", "dz/anims/workspaces/player/player_main/weapons/player_main_cz527.asi", pBehavior, "dz/anims/anm/player/ik/weapons/cz527.anm", "dz/anims/anm/player/reloads/cz527/w_CZ527_states.anm");
}
};
Прошу обратить внимание, что мы используем modded, мы модифицируем уже существующий класс внутри мода CF . Как изначально и playerbase JMAnimRegister находиться в директории 4_World.
Позже класс был доработан и добавлены более тонкие настройки :
void OnRegisterEmptyHanded( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ){}
void OnRegisterTwoHanded( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {}
void OnRegisterOneHanded( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {}
void OnRegisterRestrained( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {}
void OnRegisterSurrender( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {}
void OnRegisterHeavy( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {}
void OnRegisterPistol( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {}
void OnRegisterFireArms( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {}
void OnRegisterArcheryItem( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {}
void OnRegisterLauncher( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {}
void OnBoneRemapping( DayZPlayerType pType ) {}
Думаю комментировать не нужно и так понятно что за что отвечает!
Тогда для чего нужен класс ModItemRegisterCallbacks ? Это класс, который был добавлен в v1.08, следовательно, он работает без любых модификаций, на чистом DayZ.
modded class ModItemRegisterCallbacks {
void RegisterEmptyHanded(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior);
void RegisterOneHanded(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior);
void RegisterTwoHanded(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior);
void RegisterRestrained(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior);
void RegisterSurrender(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior);
void RegisterHeavy(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior);
void RegisterPistol(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior);
void RegisterFireArms(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior);
void RegisterArcheryItem(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior);
void RegisterLauncher(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior);
void RegisterCustom(DayZPlayerType pType);
void CustomBoneRemapping(DayZPlayerType pType);
}
Пример использования :
modded class ModItemRegisterCallbacks
{
override void RegisterOneHanded(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior)
{
super.RegisterOneHanded(pType, pBehavior);
pType.AddItemInHandsProfileIK("твой предмет", "dz/anims/workspaces/player/player_main/props/player_main_1h_matchbox.asi", pBehavior, "dz/anims/anm/player/ik/gear/book.anm");
pType.AddItemInHandsProfileIK("твой предмет 2", "dz/anims/workspaces/player/player_main/props/player_main_1h_matchbox.asi", pBehavior, "dz/anims/anm/player/ik/gear/book.anm");
}
}
"dz/anims/workspaces/player/player_main/props/player_main_1h_matchbox.asi"
"dz/anims/anm/player/ik/gear/book.anm"
это пути до анимаций, почему 2? Одна для положения предмета в руке, вторая для анимации самой кисти персонажа.
И в заключении : какой из способов наиболее эффективен? Это зависит от вас, используйте то что удобно для вас (главное не через playerbase).