c# - हमेशा खिलाड़ी के सामने ऑब्जेक्ट दिखाएँ




canvas unity3d (2)

यह संभवतः एक पूरा जवाब नहीं है, लेकिन कुछ ऐसा है जो मदद कर सकता है यह रेखा:

Vector3 navCanvas = camRotationToWatch.transform.position + camRotationToWatch.transform.forward * navCanvasDisplayDistanceFromCam;

आप camRotationToWatch से एक निश्चित दूरी पर एक स्थान बना रहे हैं लेकिन अगर वह ऑब्जेक्ट ऊपर या नीचे दिख रहा है, तो उस स्थान को navCanvasDisplayDistanceFromCam पर क्षैतिज रूप से नहीं है। यदि यह सीधे दिख रहा है, तो यह स्थिति सीधे ऊपर से ऊपर है

इसलिए जब आप एक निश्चित ऊर्ध्वाधर ऊंचाई निर्धारित करने के लिए करते हैं:

navCanvas = new Vector3(navCanvas.x, 2f, navCanvas.z);

आपको camRotationToWatch से दूरी नहीं मिल रही है, जो आपको लगता है कि आप हैं। camRotationToWatch.transform.forward का उपयोग करने के बजाय, इसे से एक वेक्टर बनाएं और Y घटक को शून्य करें, और स्थिति को ऑफसेट करने के लिए इसका उपयोग करने से पहले सामान्य करें (आप उस के साथ शून्य लंबाई वैक्टर के लिए बाहर देखने की आवश्यकता होगी हालांकि)। चाहे वह आपकी समस्या को हल करता है या नहीं, यह अनुमान लगाने में बहुत मुश्किल है लेकिन इसे आपके परिणामों को कुछ सुधारने में सहायता करनी चाहिए।

संपादित करें: कैनवास के बहुत करीब होने के साथ आप इस मुद्दे से कैसे बच सकते हैं इसका एक उदाहरण है:

Vector3 camForward = camRotationToWatch.transform.forward;
camForward.y = 0;
if (camForward.magnitude == 0)
{
    //TODO: you'll need to decide how to deal with a straight up or straight down vector
}
camForward.Normalize();
//Note: now you have a vector lying on the horizontal plane, pointing in
//the direction of camRotationToWatch
Vector3 navCanvas = camRotationToWatch.transform.position + camForward * 
    navCanvasDisplayDistanceFromCam;
//Note: if you want the canvas to be at the player's height (or some offset from), 
//use the player's y
navCanvas = new Vector3(navCanvas.x, Player.transform.y, navCanvas.z);
navigationCanvas.transform.position = navCanvas;

फिर से, यह आपके सभी मुद्दों को ठीक नहीं कर सकता है लेकिन यह सुनिश्चित करने में मदद करेगा कि प्लेयर से क्षैतिज रूप से एक निश्चित दूरी पर आपका कैनवास झूठ है और खिलाड़ी के ऊपर और नीचे गति के लिए भी क्षतिपूर्ति करेगा।

मैं इस सरल समस्या में फंस गया हूं लेकिन यह समझने में असमर्थ है कि मैं इसे क्यों नियंत्रित नहीं कर पा रहा हूं

मेरे पास कोड की ये रेखा है जो खिलाड़ी के कुछ रोटेशन पर मेरे कैनवास ऑब्जेक्ट को मेरे प्लेयर के सामने प्रदर्शित कर रहा है (कोड में कैमरेक्शनटॉवच ऑब्जेक्ट का नाम)

if (camRotationToWatch.transform.localEulerAngles.x >= navigationCanvasXMinmumLimit && camRotationToWatch.transform.localEulerAngles.x <= navigationCanvasXMaximumLimit)
        {
            if (!navCanvasHasDisplay) 
            {

                navigationCanvas.SetActive(true);
                //Debug.Log(camRotationToWatch.transform.forward);
                Vector3 navCanvas = camRotationToWatch.transform.position + camRotationToWatch.transform.forward * navCanvasDisplayDistanceFromCam;
                navCanvas = new Vector3(navCanvas.x, 2f, navCanvas.z);
                navigationCanvas.transform.position = new Vector3(navCanvas.x, navCanvas.y, navCanvas.z);

                navigationCanvas.transform.rotation = camRotationToWatch.transform.rotation;

                navCanvasHasDisplay = true;

            }
        }

        else
        {
            //navigationCanvas.SetActive(false);
            if (locationPanel.activeSelf == false && infoPanel.activeSelf == false) {
                navigationCanvas.SetActive(false);
                navCanvasHasDisplay = false;
            }
        }

यह कोड वास्तव में ठीक काम करता है जब camRotationToWatch ऑब्जेक्ट को नीचे से ऊपर और कैनवास पर सही स्थिति पर दिखाया जाता है, लेकिन जैसा कि मैं camRotationToWatch को ऊपर से नीचे घुमाने के लिए कोशिश करता हूं यह बहुत सक्रिय स्थिति में (सक्रिय) कैनवास प्रदर्शित करता है मैं कैनवास को उसी स्थिति में दिखाने के लिए कैसे रोक सकता हूँ ( कोई भी खिलाड़ी ऊपर से नीचे तक घूमता नहीं है ) लेकिन खिलाड़ी ऑब्जेक्ट के सामने प्रदर्शित होता है?


बहुत मुश्किल से यह पता लगाने की कोशिश कर रहा है कि आप वास्तव में क्या करना चाहते हैं। लेकिन ऐसा करने के लिए मुझे क्या लगता है

public GameObject follow; // The object you want to rotate around
public float distance = 2; // Distance to keep from object

private void Update() {
    Vector3 forward = follow.transform.forward;
    forward.y = 0; // This will result in Vector3.Zero if looking straight up or down. Carefull

    transform.position = follow.transform.position + forward * distance;
    transform.rotation = Quaternion.LookRotation(forward, Vector3.up);
}

मेरा मानना ​​है कि आपका "अप्रत्याशित व्यवहार" यूलर के कोणों के उपयोग के कारण है क्योंकि वे हमेशा पूरी तरह से पूर्वानुमान नहीं करते हैं। क्वाटरनियन्स या वेक्टर 3 एंगल () का प्रयोग करें जब संभव हो।

यदि आप कोण को सीमित करना चाहते हैं (कहते हैं ... अगर नीचे देख रहे हों या 45 डिग्री से अधिक ऑब्जेक्ट अक्षम करें) आप निम्न कर सकते हैं:

if (Vector3.Angle(forward, follow.transform.forward) > maxAngle) { ... }






unity3d