मुझे निम्नलिखित समस्या है, इसलिए मैं अन्य स्क्रिप्ट के चर रूप का उपयोग नहीं कर सकता। मेरे खेल में स्क्रीन का चयन करने में कठिनाई होती है, और जब उपयोगकर्ता इसका स्तर चुनता है तो उसे चर के लिए उचित मूल्य देना चाहिए। स्क्रिप्ट इस तरह दिखती है:

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

public class DifManager : MonoBehaviour
{
public float dif;

public void easy()
{
    dif = 1.05f;
    SceneManager.LoadScene("matchlenght");
}

public void normal()
{
    dif = 1.15f;
    SceneManager.LoadScene("matchlenght");
}

public void hard()
{
    dif = 1.4f;
    SceneManager.LoadScene("matchlenght");
}
}

गेमप्ले दृश्य पर एक और स्क्रिप्ट में मैं कठिनाई गुणक सेट करने के लिए भिन्न चर का उपयोग करना चाहता हूं और ऐसा लगता है:

using UnityEngine;

public class Ball2 : MonoBehaviour
{

private matchlength mlength;
public float difficultMultiplier;
public float minXspeed = 0.8f;
public float maxXspeed = 1.2f;

public float minYspeed = 0.8f;
public float maxYspeed = 1.2f;
public DifManager d;
private Rigidbody2D ballRigidbody;
private GameObject secondPaddle;

// Start is called before the first frame update
void Start()
{
    d = gameObject.GetComponent<DifManager>();
    secondPaddle = GameObject.Find("Paddle2");
    difficultMultiplier = d.dif;
    mlength = gameObject.GetComponent<matchlength>();
    ballRigidbody = GetComponent<Rigidbody2D>();
    ballRigidbody.velocity = new Vector2(Random.Range(minXspeed, maxXspeed) * (Random.value > 0.5f ? 
     -1 : 1), Random.Range(minYspeed, maxYspeed) * (Random.value > 0.5f ? -1 : 1));
    
}

मुझे अभी भी नल संदर्भ के बारे में त्रुटि मिल रही है, इसलिए मुझे लगता है कि उचित मूल्य प्राप्त करने में कुछ गड़बड़ है। मैं क्या गलत कर रहा हूं? क्रिप्या मेरि सहायता करे।

0
Pjoter 3 अक्टूबर 2020, 10:41

2 जवाब

सबसे बढ़िया उत्तर

मैंने इन दो वर्गों की प्रतिलिपि बनाई है और सब कुछ ठीक काम करता है, इसलिए किसी अन्य चर के कारण समस्या, या,

क्या ये दो वर्ग एक ही गेम ऑब्जेक्ट के अंदर हैं? यह एकमात्र तरीका है जिससे मैंने इस अपवाद का कारण पाया है ... यदि यह है,

"DifManager" पाने के लिए इस लाइन का उपयोग करें

d =  GameObject.Find("yourGameObject").GetComponent<DifManager>();

या

Public GameObject s // the game object have "DifManager" class

 d = s.GetComponent<DifManager>();

अगर नहीं,

अपना कोड डीबग करने का प्रयास करें ...

और देखें कि अपवाद कहां संदर्भित है?

जैसे Ball2.Start () (at Assets/Scripts/Ball2.cs:23)

संपादित करें:

जैसा कि टिप्पणियों में दिखाया गया है, मुद्दा अलग-अलग दृश्यों पर 2 वर्ग है, इसलिए GameObject.Find और public GameObject शून्य देंगे

इस समस्या को हल करने के लिए, PlayerPrefs का उपयोग करें

dif = 1.05f के बजाय PlayerPrefs.SetFloat("dif", 1.05f); जोड़ें सभी dif राज्यों के लिए

और difficultMultiplier = d.dif; के बजाय difficultMultiplier = PlayerPrefs.GetFloat("dif"); जोड़ें

और "डी" हटा दें

1
Mohamed Awad 5 अक्टूबर 2020, 19:45

मैंने कोशिश की कि आपका कोड ठीक काम कर रहा हो।

मान लें कि खेल ठीक काम कर रहा है और जब आप खेल को हिट करते हैं तो आपको शून्य संदर्भ मिल रहा है।

आप अपने कोड में यह जांच कर जांचते हैं कि क्या

डी = गेमऑब्जेक्ट। गेटकंपोनेंट ();

रेफर किया जा रहा है या नहीं।

void Start()
{
 d = gameObject.GetComponent<DifManager>();
 secondPaddle = GameObject.Find("Paddle2");

   if (d!= null)// Checks if the object exist, based on this you can try debugging.
   // you can add the same for SecondPaddle and mlength and check if its not equals to null....
  {

    difficultMultiplier = d.dif; 

  }

mlength = gameObject.GetComponent<matchlength>();
ballRigidbody = GetComponent<Rigidbody2D>();
ballRigidbody.velocity = new Vector2(Random.Range(minXspeed, maxXspeed) * (Random.value > 0.5f ? 
 -1 : 1), Random.Range(minYspeed, maxYspeed) * (Random.value > 0.5f ? -1 : 1));

}

यह देखने के लिए कि कौन सा मान लौटाया जा रहा है, Debug.Log() जोड़ने का भी प्रयास करें।

एक ही दृश्य के लिए अलग-अलग मान पास करने के लिए अतिरिक्त क्वेरी

यह मानते हुए कि आप कठिनाई के स्तर के आधार पर एक ही दृश्य को लोड करना चाहते हैं और बस भिन्न dif मान प्राप्त करना चाहते हैं।

कृपया नीचे दिए गए कोड परिवर्तन खोजें जो आवश्यक हैं।

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

public class DifManager : MonoBehaviour
{

public static float dif=0.0f; // change value as static

public static float GetdiffVariable() { return dif; }//We will take this function to return us the "dif" value based upon the Scene in our case its easy,normal or hard

public void easy()
{
    dif = 1.05f;
    SceneManager.LoadScene("matchlenght");
}

public void normal()
{
    dif = 1.15f;
    SceneManager.LoadScene("matchlenght");
}

public void hard()
{
    dif = 1.4f;
    SceneManager.LoadScene("matchlenght");
}
}

एक बार जब हमारे पास हमारे दृश्य से अपना मूल्य वापस करने का कार्य होता है तो हम बॉल 2 स्क्रिप्ट में बदलाव करते हैं

using UnityEngine;

public class Ball2 : MonoBehaviour
{

private matchlength mlength;
public float difficultMultiplier;
public float minXspeed = 0.8f;
public float maxXspeed = 1.2f;

public float minYspeed = 0.8f;
public float maxYspeed = 1.2f;
public DifManager d;
private Rigidbody2D ballRigidbody;
private GameObject secondPaddle;

// Start is called before the first frame update
void Start()
{
    //d = gameObject.GetComponent<DifManager>(); we dont need this line anymore we can directly assign as we are only concerned with the return value for our Scene Difficulty

   
    difficultMultiplier = d.GetdiffVariable();//Should return you different values based on the easy, normal or hard.

    Debug.Log("difficultMultiplier");// cross verify in console
    secondPaddle = GameObject.Find("Paddle2");

    mlength = gameObject.GetComponent<matchlength>();
    ballRigidbody = GetComponent<Rigidbody2D>();
    ballRigidbody.velocity = new Vector2(Random.Range(minXspeed, maxXspeed) * (Random.value > 0.5f ? 
     -1 : 1), Random.Range(minYspeed, maxYspeed) * (Random.value > 0.5f ? -1 : 1));
    
}
0
Suraj Bhandarkar 3 अक्टूबर 2020, 21:49