Playing same animation action on loop without reseting position - animation

I am trying to run a walking animation on a gltf model from animationClip. The goal is to play the walking animation whenever the up arrow key is pressed and keep it running if the key is held down. For that i am playing the animation whenever first animation is completed but the animtion only plays once. It triggers the finished event but there is no animation.
walkAction = mixer.clipAction(walkClip);
walkAction.loop = THREE.LoopOnce;
walkAction.enabled = true;
walkAction.paused = true;
walkAction.clampWhenFinished = true;
walkAction.play();
mixer.addEventListener('finished', restoreAnim);
function restoreAnim(event){
mixer.removeEventListener('finished', restoreAnim);
walkAction.play();
}
The above code was to keep the character keep moving but it clamps up after the first time but the finished eventListener is still triggered repeatedly.
Also is there any other way to do this. I am using walking animation from mixamo and the problem persists even when using multiple animations and changing different properties.

Where you are downloading that animation. if it's a site like "mixamo.com" there will be an option called "In place". you have to check that check box before you download your selected animation. Then your animation will play without repositioning its place.
check this "In place" checkbox

Related

How to get a death animation for my character in ActionScript 3 (Adobe Animate)

So basically I have two questions. I am also copying off this video from 2014: https://www.youtube.com/watch?v=w8JgpEjm8i8&t=2792s
Question 1
At the end of the video above the guys computer completely crashed and he wasnt able to show the end of how to setup a death animation for my player (link). So currently I have setup a movie clip of the death animation - just the playing spinning around - and put it in another movie clip called 'All Sprites' in which I have my other movie clips such as the different walking directions. So I have placed it in there, labelled it with "Link Death Frame". I then went back to the main script and added code so that once my player dies, the animation will play. Such as:
~
if(linkHealthBarMC.scaleX <= 0.01)
{
linkAlive = false;
}
trace(linkAlive);
if(linkAlive == false)
{
linkMC.gotoAndStop("Link Death Frame");
}
~
However, the issue comes in which the animation doesnt actually play, it just goes straight to the first frame and doesnt play. I have tested it and I know for sure that it gets stuck on the first frame and that something must be wrong with the animation as I tested it with another animation and it worked fine (once I met the requirements for the animation to play). So does anyone have any idea how I can fix this issue so that my character can play a death animation?
Question 2
How do I stop time? Like just completely freeze everything after my character is dead? Because at the moment I am just going to the first frame of the death animation and can still move and attack.
I'd assume this is on an EnterFrame loop. Then you would have two possible causes for this:
1.) You're loop is constantly checking if the 'linkAlive' if statement is false (which it is) and setting your Animation to the first frame. You can check this method by putting a Trace statement in your if statement and if the output window overflows, then that's your culprit.
2.) What you want is gotoAndPlay(-insert label here-)
Tho it is outside the scope of the question you have, I create a variable~Switch State machine to control states for me:
1.) Current State as a number (int, number, or uint)
2.) function with a switch statement (Switch is kind of a fancy if Statement)
3.) inside the cases are instructions
switch(current_state){
case 1:
linkMC.gotoAndPlay('death animation');
break;
}
if (current_state != 1){
-put movement code here-
}
This is close to what I use for my game. Just checking states or you can have a variable like the one above that explicitly checks for the death state and remove the ability to move. If you use a mouse (and I assume event listener) then you can remove the event listener for the mouse. If you use a solution like keyboard inputs then an if statement would be more what you are looking for.

In godot, I want to run an animation tied to an animated sprite one time only

I can't do this at the moment because the system I'm using to detect input runs once every frame, meaning that the animation will continue looping every frame. I tried making it so that the animation would only run when the spacebar is being held down, but it just made it start and then pause when the spacebar is unheld, which is not what I'm going for. Is there any way to make it such that when a certain key is pressed, an animated sprite runs its animation once and then stops? Thanks for your help.
Telling the animation that currently playing to play is fine. I believe the issue is with stopping it. For that I suggest having an "idle" animation. So that instead of stopping the current animation, you can tell it to play the "idle" animation (which could be as simple as one frame).
Now, if you don't want to tell the animation to play every frame, use Input.is_action_just_pressed and Input.is_action_just_released, and that will tell you when to start and stop the animation.
And if you prefer to only run code if there is some input event, you can use _input. See also _process vs. _physics_process vs. *_input and Using InputEvent.
Addendum: I paid little attention to "only one time". In the SpriteFrames editor, where you define the animations, there is a toggle in the bottom where you can tell Godot if you want the animation to loop or not.
In the odd case where you might want to change that from code, it would be something like this $AnimatedSprite.frames.set_animation_loop("animation_name", false) to make the animation not loop (you still need to tell Godot to play it, this changes how it plays from there on). Or you can replace false with true to make it loop again.

Creating a pause menu in Xcode SpriteKit

I have been developing by game for some time now and I am now trying to code in a pause menu. I have been looking through forums and videos but i still do not understand how to implement in a pause menu. I have a little pause button in the top left corner which i want to click to pause. Then it to overlay a menu, such as changing the z position of items so they are now visible. And then there be buttons such as resume and main menu which respectively do what they are called. I am still quite new to coding so any help would be appreciated. I am working with falling objects and a moving player so if i need to freeze them all, then unfreeze once resumed that might be a solution I am not sure. Thanks :D
I've tried various ways to do this, but not found a satisfactory method that works for any app/game. A lot of it will depend on how your game works. As a starting point, you probably need to look at someway of pausing the SKScene - this should halt a lot of the animation (but you may have to do extra work).
You could add some kind of blur effect or overlay and then add an unpause button and then pause the scene. Touches will still be detected when paused, but you won't have any animation or updates happening after the pause. The following code should work to pause the scene.
let pauseAction = SKAction.run {
self.isPaused = true
debugPrint("Paused")
}
self.run(pauseAction)
The reason to pause the scene in an action is that any addChild calls won't be processed if you set isPaused directly. actuallyPaused is just a bool variable to keep track of wether the scene should be paused or not (if the parent view is un-paused, the scene would also be un-paused). Btw, You do not need to use an action to set isPaused to false.
You probably also should look at implementing observers for
NSNotification.Name.UIApplicationWillResignActive
NSNotification.Name.UIApplicationDidEnterBackground
NSNotification.Name.UIApplicationWillEnterForeground
as you will also need to know when your game has been sent to background either via control center or the home button.

Animation is not looping

Im using Unity 5.3.4 and made some animation clips in the native animation panel of Unity, using keyframes.
In the Animator, I related those clips with transitions. I set "idle" as my entry clip and y checked "Loop Time" on it's properties. Nevertheless, when I hit play, the animation is not looping. It just play once and goes to the "jump" clip. Then it keeps rotation between "jump" and "hit".
Here's how things are done:
You should control the animation behaviour with conditions for example if you want it to loop till something happened you should first add a parameter to use it for checking if something happened then use it in conditions tab for example you can make an bool parameter then use it in condition so when it was checked you will move to the next state till then it will just loop in the current state , if you put no condition so there is nothing stopping the state machine from going to the next state
animation transitions
Another tutorial

Unity 5 play 2D animation one time

I need to play animation just one time.
Something like this:
public Animation[] animations;
animations[0].play();
I've looked through StackOverflow, all I found is:
animation["AnimationName"].wrapMode = WrapMode.Once;
animation.Play("AnimationName");
But it makes nothing.
Is this method actually for Unity3D 5?
Are there new ways to play animation one shoot?
I have one way for playing animation on mouse down.
For that open animator controller and add that dropping animation and one will be idle animation(this will have initial stage of dropping). Now make idle animation as default and add transition from idle to dropping animation.
Add parameter to this transition of type "Trigger". Set this parameter in transition condition.
And add one more transition from dropping animation to idle state.
So after dropping animation complete , it will come again in idle state.
Now For scripting :
int dropHash = Animator.StringtoHash("parameterName");
onmouseDown :
animator.SetTrigger(dropHash);
Hope you get some idea. This may help you. Thanks.
You have to use wrapMode. In your case, it can be something like
foreach(Animation anim in animations) {
anim.wrapMode = WrapMode.Once;
anim.Play();
}

Resources