如何在Unity中重新生成对象?

时间:2019-12-15 10:58:39

标签: c# unity3d spawn

我正在统一进行3D篮球比赛。

它有一个分数和一个计时器。一段时间后,我的场景将加载并从头开始。每次扔球时,都必须产生它。

它有一个生成按钮和一个射击按钮。但是我不想使用生成按钮。所以我想自动产生球。

我应该怎么做?我在下面给出我的生成按钮代码和抛出按钮代码。

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

public class SpawnButton: MonoBehaviour
{

    public GameObject ball;
    public GameObject BallPosition;

    public void Spawn()
    {
        ball.transform.position = BallPosition.transform.position;
        var ballPosition = ball.transform.position;
        ball.GetComponent<Rigidbody>().useGravity = false;
        ball.GetComponent<Rigidbody>().velocity = Vector3.zero;
        ball.transform.position = ballPosition;
    }

}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ThrowButton: MonoBehaviour
{
    static Animator anim;
    public GameObject ball;
    public float ballThrowingForce = 5f;
    internal bool holdingBall;


    void Start()
    {
        anim = GetComponent<Animator>();
        ball.GetComponent<Rigidbody>().useGravity = false;
    }


    public void Throw()
    {
        anim.SetTrigger("isThrowing");
        StartCoroutine(Test());        
    }

    IEnumerator Test()
    {
        yield return new WaitForSeconds(1.5f);
        ball.GetComponent<Rigidbody>().useGravity = true;
        //ball.GetComponent<Rigidbody>().AddForce(transform.up * ballThrowingForce);
        ball.GetComponent<Rigidbody>().AddForce(0, 380.0f, ballThrowingForce);       
    }

}

2 个答案:

答案 0 :(得分:1)

要生成球,您应该创建一个预制件并将其实例化。示例:

private class Spawner : MonoBehaviour
{
    public GameObject prefab;

    public GameObject Spawn() => Instantiate(prefab);
}

这样您的投掷代码应生成一个球,如果您想销毁一个旧球,则可以。

答案 1 :(得分:0)

Iv Misticos的上述回答提到了Instantiate的使用,这是生成新球的好方法。 在生成新球之前,需要指定何时必须生成。

您可以

  1. 使用一个Invoke(“ SpawnNewBallMethod”,3)//这段代码执行后,等待3秒钟并执行您在其中提到的方法,该方法可以实例化代码。

  2. 或者在完成第一个球的工作后,您可以销毁它(销毁(球))或将active设置为false-然后检查状态(是否存在(空检查?)或gameObject.active == true),然后实例化一个新球(如果它是setactive(false),别忘了以后销毁它)。

尽管gameObject.active已过时,但它将达到目的而不会使事情复杂化。 我认为Invoke优于IEnumerator,因为Invoke不会在计时器运行时停止执行流并继续执行其他操作。