當我銷毀所有盒子時,我正在嘗試做某事。我的代碼是;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class destroy : MonoBehaviour
{
private string BALL_TAG = "ball";
public AudioClip coin;
public AudioSource src;
public float numBox = 120f;
public bool isDestroyed;
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag(BALL_TAG))
{
src.clip = coin;
src.Play();
Destroy(gameObject);
isDestroyed = true;
}
}
private void Update()
{
boxes();
}
public void boxes()
{
if(isDestroyed == true)
numBox -= 1f;
if(numBox == 119)
SceneManager.LoadScene("mainManu");
}
private IEnumerator Two()
{
yield return new WaitForSeconds(1f);
Destroy(gameObject);
}
}
但它不起作用。假設當我打破 1 個盒子時它會將我發送到選單。我認為它的問題在于“numBox -= 1f;” 因為我不知道做這個很熱。
uj5u.com熱心網友回復:
我不完全理解你的代碼。所以,我需要做一些假設。我認為腳本附在盒子上,每個盒子都有這個腳本。我也認為,你的球員投籃。這些球有一個帶有球標簽的對撞機。
您的代碼存在多個問題。
第一個是,您的計數變數 numBox 保存在您的銷毀腳本中,該腳本放置在每個盒子上。這意味著,每個 Box 都在為自己計數。
你必須集中這個。有多種方法可以做到這一點。一種方法是將此變數宣告為靜態(https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/static)這不是最佳實踐,但有效。
一個更好的方法是在你的播放器上有一個腳本,它保存這個數字,每個盒子都會搜索這個腳本,如果它被破壞了就改變這個數字。
第二個大問題是,您在更新和碰撞處理中做了一些非常奇怪的事情
首先,您設定isDestroyed
為true。然后在每個 Frame 中呼叫的 box 方法中numBox
,如果這是 Destroyed 為真,則將變數減一。
因此,如果您的 Box 被擊中,您將減少每一幀。
之后,如果您的 numBox 為 119,您將檢查每一幀。如果是,則更改場景。
這就是為什么你只在一個男孩之后才進入 MainMenu 的原因
這種行為很奇怪,因為它完全沒有必要。您可以直接在 OnCollisionEnter2D 方法中減少變數。
有一些小事,可以改進。
- 當您嘗試播放聲音時,您不必在代碼中指定 AudioClip。您可以在 Unity 中通過拖放直接在 AudioSource 組件上分配它。這使您的代碼更簡單。
- 你沒有呼叫兩個協程。你已經指定了這個協程,但沒有呼叫它。
//Script on Player
public class PlayerBoxDestroyManager:MonoBehaviour
{
public int StartBoxes = 120;
private int Boxes;
private void Start()
{
Boxes = StartBoxes;
}
public void DestroyBox()
{
//Reduce our Boxes count
//This is equal to Boxes -= 1
// Boxes = Boxes -1
Boxes--;
// If we have less or zero Boxes left, we End call our EndGame methode
if(Boxes <= 0)
{
EndGame();
}
}
private void EndGame()
{
// We change the Scene to the mainMenu
SceneManager.LoadScene("mainManu");
}
}
```
//Script on all Boxes
public class Box : MonoBehaviour
{
public string Balltag = "ball";
//Audio Source the Audio Clip has to be assigned in the Unity editor
public AudioSource Coin;
private void OnCollisionEnter2D(Collision2D collision)
{
//Check it colliding Object has the right Tag
if(collision.transform.tag == Balltag)
{
//Get the reference to the Player Script
PlayerBoxDestroyManager PBDM = FindObjectOfType<PlayerBoxDestroyManager>();
//We can now access the Destroy Box Methode
PBDM.DestroyBox();
//Play the sound
Coin.Play();
//If we destroy our Object now, the Sound would also be deletet.
//We want to hear the sound, so we have to wait, till the sound is finished.
StartCoroutine(WaitTillAudioIsFinished());
}
}
IEnumerator WaitTillAudioIsFinished()
{
//we wait till the sound is finished
while (Coin.isPlaying)
{
yield return null;
}
//if finished, we destroy the Gameobject
Destroy(gameObject);
}
}
I hope I helped you. If you have questions, feel free to ask.
And sorry for my English:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/482633.html
標籤:C# 视觉工作室 unity3d if 语句 c#-2.0
上一篇:Python-如果在if內