1 सवाल: कैसे एक क्षेत्र के अंदर बदलने के लिए

पर बनाया गया सवाल Wed, May 8, 2019 12:00 AM

मेरे पास पॉइंटर नाम का गोला है जो हर जगह ट्रांसफॉर्म के साथ जा सकता है। ट्रान्सलेट () लेकिन मैं चाहता हूं कि यह क्षेत्र केवल सीमा क्षेत्र नाम के आधे क्षेत्र के अंदर चला जाए, मुझे नहीं पता कि यह कैसे करना है।

मैंने पहले ही Mathf.Clamp का उपयोग करने की कोशिश की, लेकिन जैसा कि आप इस छवि पर देख सकते हैं

लेकिन जब मैं एक खुदा हुआ वर्ग सेट करता हूं तो बहुत अधिक जगह (पीला)
और जब मैं एक परिचालित वर्ग सेट करता हूं तो चक्र (बैंगनी /गुलाबी)

से बहुत अधिक स्थान होता है

तो क्या क्षेत्र के अंदर किसी आंदोलन को सीमित करने का कोई समाधान है?

EDIT: यह मेरा वास्तविक कोड है:

using UnityEngine;
using System.Collections;

public class TranslationClavier : MonoBehaviour {

    public float vitesse_translation = 1.0f;



    void Update () {
            if (Input.GetKey(KeyCode.DownArrow))
            {
                transform.Translate(Vector3.up * vitesse_translation * Time.deltaTime);
            }

            if (Input.GetKey(KeyCode.UpArrow))
            {
                transform.Translate(Vector3.down * vitesse_translation * Time.deltaTime);
            }

            if (Input.GetKey(KeyCode.RightArrow))
            {
                transform.Translate(Vector3.right * vitesse_translation * Time.deltaTime);
            }

            if (Input.GetKey(KeyCode.LeftArrow))
            {
                transform.Translate(Vector3.left * vitesse_translation * Time.deltaTime);
            }

            if (Input.GetKey(KeyCode.I))
            {
                transform.Translate(Vector3.forward * vitesse_translation * Time.deltaTime);
            }

            if (Input.GetKey(KeyCode.K))
            {
                transform.Translate(-Vector3.forward * vitesse_translation * Time.deltaTime);
            }
    }

}

के तहत आप मेरे छोटे गोले को देख सकते हैं और मैं उसे बड़े गोले कोलाइडर के अंदर दबाना चाहता हूं

>> </a> </p>
    </div>
<div class = - 1

1 उत्तर                              1                         

यह बहुत आसान है। सबसे पहले आपको गोले के केंद्र से उस दूरी को जानना होगा जो आप यात्रा करने वाले हैं, इसलिए आप इसे दो चरणों में करते हैं। यह मानते हुए कि आप इसे एक ऐसे ट्रांसफ़ॉर्म से बुला रहे हैं जो आपके लिए एक क्षेत्र के समान है:

Vector3 newPosition=transform.localPosition+myDetla;
if (newPosition.magnitude>sphereRadius) transform.Translate(myDelta);

यह केवल अनुवाद करेगा यदि गंतव्य क्षेत्र के भीतर है। जो भी अन्य शर्तें (जैसे एक आधा क्षेत्र बाधा) आपको करने की आवश्यकता है - आप नए न्यूपोजिशन का विश्लेषण कर सकते हैं। यदि आप हमेशा स्थानांतरित करना चाहते हैं, लेकिन चालमनेट की परिमाण को सीमित करते हैं, तो आप इस तथ्य का उपयोग कर सकते हैं कि आप सेक्टरों को दिशा और परिमाण में विभाजित कर सकते हैं और उन्हें पुन: इकट्ठा कर सकते हैं, उदाहरण के लिए

if (newPosition.magnitude>sphereRadius)  
      newPosition=newPosition.direction*sphereRadius; //will clamp to sphere
if (newPosition.y<0) newPosition.y=0;
transform.localPosition=newPosition;
    
0
2019-05-08 16: 27: 13Z
  1. आपके उत्तर के लिए धन्यवाद, लेकिन मैं एकता पर नया हूँ और मुझे यह अच्छी तरह से समझ में नहीं आ रहा है कि मेरा कोड
    कैसे लागू करें।
    2019-05-08 19: 20: 34Z
  2. 'myDelta' क्या है?
    2019-05-08 21: 20: 39Z
  3. myDelta को कीकोड के आधार पर मान निर्दिष्ट किए जाने चाहिए। Vector3.left * vitesse_translation * Time.deltaTime, अनुवाद करने से पहले इसे एक अस्थायी चर में संग्रहीत करें
    2019-05-09 09: 18: 28Z
  4. ठीक है ... अब मैं आपके उत्तर से पूरी तरह से हार गया हूं: '0
    2019-05-09 10: 33: 04Z
  5. क्या आप मुझे अपना उदाहरण दे सकते हैं कि मैं अपना कोड मेरे
    पर कैसे लागू करूं।
    2019-05-09 10: 36: 56Z
स्रोत रखा गया यहाँ