【问题标题】:Unity particle system play after collisionunity 粒子系统碰撞后播放
【发布时间】:2017-09-06 14:19:05
【问题描述】:

我在 Unity 中制作了一个项目,这是一款需要明确的游戏。所以玩家有一辆科幻汽车,他试图避开障碍物——岩石。 当汽车撞到石头时,游戏管理器会加载“积分”屏幕以选择退出或重新启动。 我的问题是我想在汽车行驶时让岩石爆炸,然后游戏管理器将加载“信用”屏幕。

我的一些代码:

对于玩家碰撞:

public class PlayerCollision : MonoBehaviour {

    public PlayerMovement movement;     
    public static bool y = true;

    public void OnCollisionEnter (Collision collisionInfo)
    {
        // We check if the object we collided with has a tag called "Obstacle".
        if (collisionInfo.collider.tag == "Obstacle")
        {          
            movement.enabled = false;   // Disable the players movement.
            y = false;
            FindObjectOfType<GameManager>().EndGame();            
        }
    }
} 

游戏管理器:

public class GameManager : MonoBehaviour {

bool gameHasEnded = false;

public float restartDelay = 1f;

public GameObject completeLevelUI;

public void CompleteLevel ()
{
    completeLevelUI.SetActive(true);
}

public void EndGame ()
{
    if (gameHasEnded == false)
    {
        gameHasEnded = true;
        Debug.Log("GAME OVER");
        Invoke("Restart", restartDelay);
    }
}

void Restart ()
    {
         SceneManager.LoadScene("Credits");
         //SceneManager.LoadScene(SceneManager.GetActiveScene().name);
     }
}

结束触发器:

public class EndTrigger : MonoBehaviour {

    public GameManager gameManager;

    void OnTriggerEnter ()
    {
        gameManager.CompleteLevel();
    }
}

关卡完成:

public class LevelComplete : MonoBehaviour {

    public void LoadNextLevel ()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1); 
    }
}

菜单:

public class Menu : MonoBehaviour {

    public void StartGame ()
    {
         SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);  
    }
}

我写过其他脚本。如果你想要什么,请告诉我。谢谢大家。

【问题讨论】:

  • 添加一个带有你想要的粒子效果的空游戏对象。将此空的游戏对象添加到场景中的岩石中。确保您首先禁用了它们。当发生碰撞时,启用它们。之后加载您的学分场景。您可以为此使用协程。
  • 碰撞发生时如何激活它们?
  • 您可以从谷歌搜索开始。 “如何启用游戏对象统一”就像这样。 Here 来自 Unity。
  • 我找不到任何东西。我尝试了太多不同的东西,什么都没有......
  • 你能在没有任何前置条件的情况下通过代码启用/禁用任何游戏对象吗?

标签: c# unity3d project collision particle-system


【解决方案1】:

为您的岩石添加粒子系统。取消选中“循环播放”和“清醒播放”。然后你可以通过添加下面的行来玩。

public void OnCollisionEnter (Collision collisionInfo)
{
    // We check if the object we collided with has a tag called "Obstacle".
    if (collisionInfo.collider.tag == "Obstacle")
    {          
        movement.enabled = false;   // Disable the players movement.
        y = false;
        collisionInfo.gameObject.GetComponent<ParticleSystem>().Play(); // play the explosion
        FindObjectOfType<GameManager>().EndGame();            
    }
}

【讨论】:

  • 我上传了一张图片,看看我是怎么装的。而且,我把你写的代码放进去后,游戏场景管理器没有加载下一个场景。
  • 您需要修改我添加的行以正确导航并获取粒子系统。此外,请确保未选中“Play on Awake”。
  • 如何修改?我是新手,很抱歉。此外,TrailsBlack 和 TrailsWhite ParticleSystems 都未选中 Play on Awake。
  • 这取决于您的粒子系统游戏对象相对于对撞机的位置。例如,如果Rocks 有碰撞器,Explosion 有你的粒子系统,你可以这样做:collisionInfo.transform.GetChild(0).gameObject.GetComponent().Play();
  • 是的,就是这样,岩石有对撞机,爆炸有粒子系统。我试过了,但我得到一个错误:“ParticleSystem”是一种类型,在给定的上下文中无效。
【解决方案2】:

我会改变你的方法。据我了解,您已经有一个 endTrigger [带有对撞机触发器],如果玩家进入,它会结束游戏。所以取消选中玩家对撞机中的触发器,而是将该触发器添加到岩石对撞机,这样当玩家崩溃时它会:

  • 激活粒子系统
  • 让岩石隐形
  • 结束游戏

您可以将此脚本添加到您的岩石中,看看它是如何工作的

public class RockTrigger : MonoBehaviour {

    public GameManager gameManager;
    ParticleSystem myParticleSystem;

    void Awake()
    {
        myParticleSystem = GetComponent<ParticleSystem>();
    }

    void OnTriggerEnter(Collider other)
    {
        myParticleSystem.Play();
        GetComponent<MeshRenderer>.enabled = false;
        gameManager.GetComponent<GameManager>().EndGame();

    }
}

关于 OnTriggerEnter 的注意事项:如果你只有玩家在场景中移动,这很好(我使用你在 EndGame 中使用的相同模式), 但是如果有其他带有刚体的游戏对象在移动 场景你应该检查other 是否确实是玩家。通常标记播放器并检查if(other.tag == "Player")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多