碰撞触发动画

时间:2017-05-30 21:34:34

标签: c# unity3d

我试图让我的玩家击中一个物体,摧毁物体并触发动画,但我尝试的一切都会导致错误。我在c#比较新,所以答案可能很明显,但我需要帮助。如何设置它以使碰撞导致对象消失并让玩家播放动画?这是我目前正在尝试的脚本。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class succ : MonoBehaviour
{
    public float speed = .15f;
    public static float jumpSpeed = 170f;
    void Start()
    {
        GetComponent<ConstantForce2D>().enabled = false;
        GameObject.Find("goal");
    }

    public bool animation_bool;
    private object coll;
    private object other;

    void Update()
    {
        OnCollisionStay2D(Collision2D coll);
        {
            if (coll.gameObject.tag == "succ") ;
            {
                animation_bool = true;
                GetComponent<Animator>().SetBool("succ", animation_bool);
                GetComponent<ConstantForce2D>().enabled = true;
                Destroy(other.object);
            }
        }
    }

    private void Destroy(object gameObject)
    {
        throw new NotImplementedException();
    }

    private void OnCollisionStay2D(Collision2D collision2D, object coll)
    {
        throw new NotImplementedException();
    }
}

1 个答案:

答案 0 :(得分:0)

我可以看到一些错误的东西,但我会先回答你的问题。

我建议您将MonoBehaviour方法OnCollisionStay2D更改为OnCollisionEnter2D。 OnCollisionStay2D是“发送每个帧,其他对象上的对撞机正在触摸此对象的对撞机”。 OnCollisionEnter2D“在传入的对撞机与此物体的对撞机接触时发送”。

我相信你正在寻找后者,因为你只想在碰撞过程中触发一次。你也在摧毁另一个物体,即使你想这样做也不可能再打电话给OnCollisionStay2D。

您还应该删除Update方法。老实说,我不明白你现在想要达到的目标。所有的OnCollision方法都会自动调用;你不必自己打电话。

然后您可以使用Awake和OnCollisionEnter2D方法,如下所示

public class Succ : MonoBehaviour
{
    private Animator animator;

    private void Awake()
    {
        // You can already get a reference to the Animator on Awake
        // This way you do not have to do it on every collision
        animator = GetComponent<Animator>();
    }

    // Use OnCollisionEnter2D instead since the code
    // needs to be excecuted only once during the collision
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("succ")
        {
            // Assuming that you only want to trigger an animation once
            // to reflect attacking or colliding, you could use SetTrigger
            // instead. Otherwise you need to use SetBool again to set it
            // back to false. You should then change the Animator parameter 
            // accordingly, from a bool to a trigger.
            animator.SetTrigger("succ");
            Destroy(collision.gameObject);
        }  
    }
}

除此之外,我还有一些我想评论的内容:

  • 我不确定您是通过在Start上将ConstantForce2D组件设置为false然后在碰撞时将其设置为true来实现的。
  • 您似乎在Start上使用GameObject.Find。 GameObject.Find应该很少使用。它可能非常昂贵,特别是如果你的场景中有很多GameObjects;这是因为它只是通过Hiearchy,将参数字符串与GameObjects的名称进行比较,直到找到匹配或用完游戏对象为止。
  • 此外,你在Start上使用GameObject.Find来寻找GameObject,但是你没有把它存储在任何地方,使整个发现过程完全没有意义。

总的来说,我建议您查看Unity自己提供的所有不同学习资源。您的问题是关于相当基本的功能,这些功能在所有不同的教程中都有所涉及。