News

News
HomeNews
Discord - შემოგვიერთდი
RoadmapFAQ

Tech Blog 3 - ანიმაცია

Gurami · 1 year ago · Tech

წინა პოსტში DOTween-იდან FEEL-ზე ტრანზიცია გაჩვენეთ. ეხლა კი დრო იყო რეალური ანიმაციების ჩასმის, ისე რომ თამაშის ლოგიკასთან ერთად მჭიდროდ მუშაობდეს, მაგრამ თან ლოგიკასთან არაფერი აკავშირებდეს...naniii?


დავიწყოთ თავიდან. ანუ თითქოს და FEEL-ის ჩანერგვის შემდეგ, ეხლა შეგვიძლია უბრალოდ ედიტორი გავხსნათ და პერსონაჟის Tween, უბრალოდ რეალური ანიმაციით ჩავანაცვლოთ, არა? თითქოს კი, რეალურად თითქმის:



PlayAnimation აქ ჩემი FEEL-ზე დანამატია, ვინაიდან Spine Pro-ს ვიყენებთ 2D ანიმაციისთვის, და FEEL-ს მისი მხარდაჭერა არ აქ. არაუშავს რომ არ აქ, მთავარია რომ მარტივად ამატებ იმას რაც გჭირდება.


თითქოს ეგაა და ეგ, მაგრამ პრობლემას წავაწყდი. თავდაპირველად მეგონა რომ ესეთი მიდგომით ყველაფერი "ჯიგრულად" გამოვიდოდა:


ანუ ანიმაციამ ჩაიარა, დაველოდეთ, განვახორციელეთ რეალური თამაშის ცვლილება. ქვემოთ მოცემულიდან ჩანს პრობლემა:



პირველი იმდენად სწრაფია, რომ ამ მიდგომას "იტანს". მაგრამ მეორეში აშკარაა რომ, სანამ "ჭინკა" არ გაისვრის, მოთამაშეს ზიანი მიყენებული არ უნდა ქონდეს.


გადავწყვიტე რომ ანიმაციის "ივენთებით" ამ პრობლემის მოგვარება სწორი იქნებოდა, თან მინდოდა რომ კონფიგურირებადი ყოფილიყო ScriptableObject დონეზე. გამოვიდა ესე:

public class Effect
    {
        public List nodeList;
    }

    public abstract class Node
    {
        public SkeletonDataAsset AnimationDataAsset;
        public EventData EventData;
    }




ყველა უნარს, აქ ეფექტი. ეფექტი შედგება ნაწილაკებისგან, და ნებისმიერი ნაწილაკის ანიმაციის კონკრეტულ ივენთზე მიბმა არის შესაძლებელი. როდესაც ვიყენებთ უნარს იწყება ეფექტი, რომელიც მიყვება ნაწილაკებს სათითაოდ და ასრულებს ნაწილაკებში არსებულ მითითებას. თუ ნაწილაკი ანიმაციის ივენთს უნდა დაელოდოს, ეფექტი პაუზდება, და გრძელდება მხოლოდ ივენთის მიღების დროს, დიაგრამის დონეზე ესე:



კოდი დასახვეწია, და ვფიქრობ FEEL-ს უკეთ რომ გავუგებ გავამარტივებ, მთავარია რომ ანიმაციამ არაფერი იცის თამაშის შესახებ, და კოდშიც არსად არაფერი მიწერია კონკრეტული ანიმაციის შესახებ, გატანილი მაქ Editor-ში კონფიგურაციის დონეზე:

private async void OnUseAbility(UseAbilityEvent e)
        {
            if (e.Source != BattleCharacter) return;

            _activeFeedback = useAbilityFeedback.PlayFeedbacksTask();

            var spinePlayAnimationFeedback = useAbilityFeedback.FeedbacksList
                .OfType<MMF_SpinePlayAnimation>().FirstOrDefault();

            spinePlayAnimationFeedback?.SubscribeToSpineEvents(animationEvent =>
            {
                EventBus.Raise(new TriggerAbilityEffectNodeEvent
                {
                    Event = e,
                    EventData = animationEvent.Data
                });
            });

            await _activeFeedback;

            spinePlayAnimationFeedback?.UnsubscribeFromSpineEvents();

            Dequeue();
        }






© 2024 9 Mountains Studio
🤜🤛 ManaKeep
HomeNewsDiscord - შემოგვიერთდიRoadmapFAQ