Unity Animation Help

Started by
12 comments, last by LeftyGuitar 8 years, 8 months ago

Hello,

I need some help with playing an animation after a ball has hit a target. The code is in C#. I've tried playing the animation by first declaring it. I've also tried to play it by using the getComponent method. When the ball hits the target, the animation dosen't play. It's just a still frame. Any help is greatly appericated. I can provide more code or info if it is needed.


Animation LightWoman;

void OnCollisionEnter(Collision col) {
      if(col.gameObject.CompareTag("ball") && col.gameObject.CompareTag("Doofus1"))
			{
				this.GetComponent<Animation>().Play("DoofusAni");
			}

    	else if(col.gameObject.CompareTag("ball") && col.gameObject.CompareTag("lightwoman1"))
			{
				LightWoman.Play("LightWomanAni");
			}
}
Advertisement

First utilize mechanim. Create an empty animation call it do nothing this is your default animation. Then add your ball animation to mechanims animation window and create a transition to the new animation from DoNothing. Add a trigger param that will cause this DoNothing to transition to the other animation. I used lots of key words for you to look at the documentation and/or find exactly how to do that. You could even create a int param and give this animation the value of 1 so when you set this param to 1 the animation plays.

Here is an example usage of it http://docs.unity3d.com/Manual/AnimationParameters.html

I hope that helps... If I was at my dev station I would write up an exact example but I am sadly not.

I probably should have explained it more. I'm just trying to play an animation clip through code, once the ball hits the target, the body image should animate. I already made the clips, they're just not playing even though I have them set to play.

Your if statements seem incorrect. Take a look at the first one; it is only true if it has two tags: "ball" and "Doofus1". However, a GameObject can only have 1 tag, not multiple, so this statement will never be true. The same goes for the second if statement.

If fixing that part doesn't solve the entire problem, you might want to double check a few of the following things:

1. An obvious one: are there any errors/exceptions?

2. Do you have the correct tag assigned to the GameObject you are testing collision with? (i.e. is there really an object with that tag colliding in the test you have?).


using UnityEngine;
using System.Collections;

public class Target : MonoBehaviour {

	// Use this for initialization

	Animation DarkWomanSuitAni;
    GameObject womansuit;
	void Start () {
	}



	// Update is called once per frame
	void Update () {
		if(GameObject.FindGameObjectWithTag("lightwoman1"))
		{
			gameObject.SetActive(true);
		}
	}



	void OnCollisionEnter(Collision col) {


		if (col.gameObject.CompareTag ("ball")) {

			// SEND MESSAGE HERE
			Debug.Log("TARGET HIT: trigger animation and poin increase here");
			this.GetComponent<Animation>().Play("target_hit");
			//this.GetComponent<Player>().dunks++;

			//this.GetComponent<Animation>().Play("SeatFlip");
			//col.gameObject.GetComponent<Animation>().Play("LightWomanAni");

			DarkWomanSuitAni.Play("DarkWomanSuitAni");
	
			 
			 //col.gameObject.GetComponent<Animation>().Play("LightWomanAni");
			 SoundManager.Instance.PlaySound("splash");

			// ignores collision with ball after being hit once 
			// (to prevent multiple hits from the same ball) 
			Physics.IgnoreCollision(this.GetComponent<Collider>(), col.collider);
		}
}

Ok, so what I want to do is play the animation after you hit the target with the ball. When I try to hit the target, it says onTrigger event not found. Or object reference not set to an instance of object.

Does it switch between those errors or are you only getting "object reference not set to an instance of an object" (better known as a nullreference exception)?

If the latter, try to see where it's going wrong by looking at the line number the error is indicating in the Unity log. You can also double click it to make it select the line number of where the exception occurred in your IDE immediately.

The error is telling you that you are trying to do something with an object that (no longer) exists (the object is referencing 'null')! It being null could be the result of the of calling GetComponent without the component being found and thus returning null instead. Another possibility is that you haven't assigned a reference to the "DarkWomanSuitAni" component in the editor, causing it to be null as well.

Anyway, at this point it could be anything really, we have to guess and it's much easier and quicker for you to try and find the problem yourself from there on smile.png. (though you can of course come back if you have any additional questions.)

If you are also getting an error occasionally that says something like the 'onTrigger event not found' as you mentioned, we will need some more info/code, as I don't recall Unity ever giving such an error from itself*.

*(sounds like a custom message requiring a receiver, while not having any)

NullReferenceException
UnityEngine.Animation.Play (System.String animation) (at C:/buildslave/unity/build/artifacts/generated/common/modules/AnimationsBindings.gen.cs:612)
Target.OnCollisionEnter (UnityEngine.Collision col) (at Assets/Scripts/Caleb/Target.cs:39)

This is the error I'm getting and here is my updated code.


using UnityEngine;
using System.Collections;

public class Target : MonoBehaviour {

	// Use this for initialization

	Animation DarkWomanSuitAni;
    GameObject womansuit;
	void Start () {
		DarkWomanSuitAni = new Animation();
	}



	// Update is called once per frame
	void Update () {
		if(GameObject.FindGameObjectWithTag("lightwoman1"))
		{
			gameObject.SetActive(true);
		}
	}



	void OnCollisionEnter(Collision col) {


		if (col.gameObject.CompareTag ("ball")) {

			// SEND MESSAGE HERE
			Debug.Log("TARGET HIT: trigger animation and poin increase here");
			this.GetComponent<Animation>().Play("target_hit");
			//this.GetComponent<Player>().dunks++;

			//this.GetComponent<Animation>().Play("SeatFlip");
			//col.gameObject.GetComponent<Animation>().Play("LightWomanAni");
	
			DarkWomanSuitAni.Play("DarkWomanSuitAni");
			 
			 //col.gameObject.GetComponent<Animation>().Play("LightWomanAni");
			 SoundManager.Instance.PlaySound("splash");

			// ignores collision with ball after being hit once 
			// (to prevent multiple hits from the same ball) 
			Physics.IgnoreCollision(this.GetComponent<Collider>(), col.collider);
		}
}

It is odd that you are defining a animation object in the start yet in the collision code that variable is null. I bet if you do a check on the DarkWomanSuitAni object it will return as a null object meaning it didn't get instantiated. Have you verified if the Start method is being called on the game object? Try logging something to the dubug console in your start method to see if that is being executed. If this is not then your game object isn't getting istantiated fully in Unity.

Any more details you can provide might be helpful for us in diagnosing this issue. But as it stands all we can do is generically suggest places to look for problems and take a stab in the dark to help you.

In start, you create a new animation, rather than referencing the one that is currently on the GameObject. What you want to do is make the variable available for assignment in the editor or use the component to get the already existing animation.

Making it possible to assign (drag in) a reference to a component in the editor can be done by using the SerializeField attribute like so:


[SerializeField]
private Animation animation;

(you can omit the 'private', though)

Currently it's most likely throwing the exception because the new animation component you create in the Start method isn't the one with the animation clip you are looking for. You are now trying to play the animation "DarkWomanSuitAni" on an animation component that doesn't have this particular animation clip (in fact, it has no animation clips at all!).

NullReferenceException
UnityEngine.Animation.Play (System.String animation) (at C:/buildslave/unity/build/artifacts/generated/common/modules/AnimationsBindings.gen.cs:612)
Target.OnCollisionEnter (UnityEngine.Collision col) (at Assets/Scripts/Caleb/Target.cs:40)

I'm getting this error now. I tried adding in the SerializeField command.


using UnityEngine;
using System.Collections;

public class Target : MonoBehaviour {

	// Use this for initialization

	[SerializeField]
	Animation DarkWomanSuitAni;
    GameObject womansuit;
	void Start () {
		DarkWomanSuitAni = new Animation();
	}



	// Update is called once per frame
	void Update () {
		if(GameObject.FindGameObjectWithTag("lightwoman1"))
		{
			gameObject.SetActive(true);
		}
	}



	void OnCollisionEnter(Collision col) {


		if (col.gameObject.CompareTag ("ball")) {

			// SEND MESSAGE HERE
			Debug.Log("TARGET HIT: trigger animation and poin increase here");
			this.GetComponent<Animation>().Play("target_hit");
			//this.GetComponent<Player>().dunks++;

			//this.GetComponent<Animation>().Play("SeatFlip");
			//col.gameObject.GetComponent<Animation>().Play("LightWomanAni");
	
			DarkWomanSuitAni.Play("DarkWomanSuitAni");
			 
			 //col.gameObject.GetComponent<Animation>().Play("LightWomanAni");
			 SoundManager.Instance.PlaySound("splash");

			// ignores collision with ball after being hit once 
			// (to prevent multiple hits from the same ball) 
			Physics.IgnoreCollision(this.GetComponent<Collider>(), col.collider);
		}
}

This topic is closed to new replies.

Advertisement