खोज…


परिचय

Vector3 संरचना एक 3 डी समन्वय का प्रतिनिधित्व करता है, और की रीढ़ की हड्डी संरचनाओं में से एक है UnityEngine पुस्तकालय। Vector3 संरचना अधिकतर गेम ऑब्जेक्ट्स के Transform घटक में पाई जाती है, जहां इसका उपयोग स्थिति और पैमाने को रखने के लिए किया जाता है। Vector3 आम वेक्टर ऑपरेशनों को करने के लिए अच्छा सुविधा प्रदान करता है। आप यूनिटी एपीआई में Vector3 संरचना पर अधिक पढ़ सकते हैं।

वाक्य - विन्यास

  • सार्वजनिक वेक्टर 3 ();
  • सार्वजनिक वेक्टर 3 (फ्लोट एक्स, फ्लोट वाई);
  • सार्वजनिक वेक्टर 3 (फ्लोट एक्स, फ्लोट वाई, फ्लोट जेड);
  • वेक्टर 3।erp (वेक्टर 3 शुरुआत, वेक्टर 3 लक्ष्यपोज, फ्लोट आंदोलन);
  • वेक्टर 3।erpUnclamped (वेक्टर 3 शुरुआत, वेक्टर 3 लक्ष्य आंदोलन, फ्लोट आंदोलन);
  • Vector3.MoveTowards (वेक्टर 3 शुरुआत, वेक्टर 3 लक्ष्य-निर्धारण, फ़्लोट दूरी);

स्थैतिक मूल्य

Vector3 संरचना में कुछ स्थिर चर शामिल हैं जो आमतौर पर इस्तेमाल किए गए Vector3 मान प्रदान करते हैं। अधिकांश एक दिशा का प्रतिनिधित्व करते हैं , लेकिन अतिरिक्त कार्यक्षमता प्रदान करने के लिए उन्हें अभी भी रचनात्मक रूप से उपयोग किया जा सकता है।



Vector3.zero और Vector3.one

Vector3.zero और Vector3.one आम तौर पर एक सामान्यीकृत करने के संबंध में उपयोग किया जाता है Vector3 ; यह है कि, एक Vector3 जहां x , y और z मानों का परिमाण 1 है। जैसे कि, Vector3.zero सबसे कम मूल्य का प्रतिनिधित्व करता है, जबकि Vector3.one एक सबसे बड़ा मूल्य दर्शाता है।

Vector3.zero का उपयोग आमतौर पर ऑब्जेक्ट ट्रांसफ़ॉर्म पर डिफ़ॉल्ट स्थिति सेट करने के लिए भी किया जाता है।


निम्न वर्ग Vector3.zero और Vector3.one का उपयोग करता है। एक क्षेत्र को बढ़ाने और Vector3.one करने के लिए।

using UnityEngine;

public class Inflater : MonoBehaviour 
{
    <summary>A sphere set up to inflate and deflate between two values.</summary>
    public ScaleBetween sphere;

    ///<summary>On start, set the sphere GameObject up to inflate
    /// and deflate to the corresponding values.</summary>
    void Start()
    {
        // Vector3.zero = Vector3(0, 0, 0); Vector3.one = Vector3(1, 1, 1);
        sphere.SetScale(Vector3.zero, Vector3.one);
    }
}

A sphere inflated and deflated between Vector3.zero and Vector3.one



स्थैतिक दिशा

स्थैतिक दिशाएं तीनों अक्षों के सकारात्मक और नकारात्मक के साथ दिशा के साथ कई अनुप्रयोगों में उपयोगी हो सकती हैं। यह ध्यान रखना महत्वपूर्ण है कि एकता बाएं हाथ की समन्वय प्रणाली को रोजगार देती है, जिसका दिशा पर प्रभाव पड़ता है।

In the left-handed coordinate system, the X axis moves to the right, the Y axis moves upwards and the Z axis moves further inwards.


निम्न वर्ग वस्तुओं को तीन अक्ष पर ले जाने के लिए स्थैतिक Vector3 दिशाओं का उपयोग करता है।

using UnityEngine;

public class StaticMover : MonoBehaviour 
{
    <summary>GameObjects set up to move back and forth between two directions.</summary>
    public MoveBetween xMovement, yMovement, zMovement;

    ///<summary>On start, set each MoveBetween GameObject up to move
    /// in the corresponding direction(s).</summary>
    void Start()
    {
        // Vector3.left = Vector3(-1, 0, 0); Vector3.right = Vector3(1, 0, 0);
        xMovement.SetDirections(Vector3.left, Vector3.right);

        // Vector3.down = Vector3(0, -1, 0); Vector3.up = Vector3(0, 0, 1);
        yMovement.SetDirections(Vector3.down, Vector3.up);

        // Vector3.back = Vector3(0, 0, -1); Vector3.forward = Vector3(0, 0, 1);
        zMovement.SetDirections(Vector3.back, Vector3.forward);
    }
}

Animated cubes moving in the static directions.



सूची

मूल्य एक्स y z समतुल्य new Vector3() विधि
Vector3.zero 0 0 0 new Vector3(0, 0, 0)
Vector3.one 1 1 1 new Vector3(1, 1, 1)
Vector3.left -1 0 0 new Vector3(-1, 0, 0)
Vector3.right 1 0 0 new Vector3(1, 0, 0)
Vector3.down 0 -1 0 new Vector3(0, -1, 0)
Vector3.up 0 1 0 new Vector3(0, 1, 0)
Vector3.back 0 0 -1 new Vector3(0, 0, -1)
Vector3.forward 0 0 1 new Vector3(0, 0, 1)

एक वेक्टर 3 बनाना

एक Vector3 संरचना कई तरीकों से बनाई जा सकती है। Vector3 एक संरचना है, और इस तरह, आमतौर पर उपयोग करने से पहले तत्काल करने की आवश्यकता होगी।


कंस्ट्रक्टर्स

एक Vector3 को तत्काल बनाने के लिए तीन निर्माणकर्ता हैं।

निर्माता परिणाम
new Vector3() (0, 0, 0) के समन्वय के साथ एक Vector3 संरचना बनाता है।
new Vector3(float x, float y) दिए गए x और y सह-निर्देशांक के साथ एक Vector3 संरचना बनाता है। z को 0 पर सेट किया जाएगा।
new Vector3(float x, float y, float z) दिए गए x , y और z निर्देशांक के साथ एक Vector3 संरचना बनाता है।


एक से परिवर्तित Vector2 या Vector4

जबकि दुर्लभ, आप स्थितियों जहाँ आप एक के समन्वय का इलाज करने की आवश्यकता होगी में पड़ सकते हैं Vector2 या Vector4 एक के रूप में संरचना Vector3 । ऐसे मामलों में, आप बस पारित कर सकते हैं Vector2 या Vector4 सीधे Vector3 , पहले यह instantiating बिना। जैसा कि माना जाना चाहिए, एक Vector2 संरचना केवल x और y मूल्यों को पारित करेगी, जबकि एक Vector4 वर्ग अपने w को छोड़ देगा।


हम नीचे दी गई स्क्रिप्ट में प्रत्यक्ष रूपांतरण देख सकते हैं।

void VectorConversionTest()
{
    Vector2 vector2 = new Vector2(50, 100);
    Vector4 vector4 = new Vector4(50, 100, 200, 400);

    Vector3 fromVector2 = vector2;
    Vector3 fromVector4 = vector4;

    Debug.Log("Vector2 conversion: " + fromVector2);
    Debug.Log("Vector4 conversion: " + fromVector4);
}

Debug output confirms that both Vector2 and Vector4 have been successfully converted to Vector3.

आंदोलन लागू करना

Vector3 संरचना में कुछ स्थिर कार्य शामिल हैं जो उपयोगिता प्रदान कर सकते हैं जब हम Vector3 पर आंदोलन लागू करना चाहते हैं।

Lerp और LerpUnclamped

लार्प फ़ंक्शंस प्रदान किए गए अंश के आधार पर दो सह-निर्देशांक के बीच गति प्रदान करते हैं। जहां Lerp केवल दो को-ऑर्डिनेट्स के बीच आंदोलन की अनुमति देगा, LerpUnclamped उन LerpUnclamped अनुमति देता है जो दो को-ऑर्डिनेट्स के बीच की सीमाओं के बाहर चलते हैं।

हम एक float रूप में आंदोलन के अंश प्रदान करते हैं। 0.5 मान के साथ, हम दो Vector3 निर्देशांक के बीच का मध्य बिंदु पाते हैं। 0 या 1 का मान पहले या दूसरे Vector3 , Vector3 को लौटाएगा, क्योंकि ये मान या तो बिना किसी आंदोलन के सहसंबद्ध होते हैं (इस तरह पहला Vector3 लौट रहा है), या पूरा आंदोलन (यह दूसरा Vector3 लौटाता है)। यह ध्यान रखना महत्वपूर्ण है कि न तो फ़ंक्शन आंदोलन के अंश में परिवर्तन के लिए समायोजित करेगा। यह ऐसी चीज़ है जिसके लिए हमें मैन्युअल रूप से खाता होना चाहिए।

Lerp साथ, सभी मान 0 और 1 बीच में Lerp हैं। यह उपयोगी है जब हम एक दिशा की ओर आंदोलन प्रदान करना चाहते हैं, और गंतव्य को ओवरशूट नहीं करना चाहते हैं। LerpUnclamped किसी भी मूल्य को ले सकता है, और इसका उपयोग गंतव्य से दूर , या गंतव्य से अतीत को गति प्रदान करने के लिए किया जा सकता है।


निम्न स्क्रिप्ट किसी ऑब्जेक्ट को सुसंगत गति से ले जाने के लिए Lerp और LerpUnclamped का उपयोग करता है।

using UnityEngine;

public class Lerping : MonoBehaviour
{
    /// <summary>The red box will use Lerp to move. We will link
    /// this object in via the inspector.</summary>
    public GameObject lerpObject;
    /// <summary>The starting position for our red box.</summary>
    public Vector3 lerpStart = new Vector3(0, 0, 0);
    /// <summary>The end position for our red box.</summary>
    public Vector3 lerpTarget = new Vector3(5, 0, 0);

    /// <summary>The blue box will use LerpUnclamped to move. We will 
    /// link this object in via the inspector.</summary>
    public GameObject lerpUnclampedObject;
    /// <summary>The starting position for our blue box.</summary>
    public Vector3 lerpUnclampedStart = new Vector3(0, 3, 0);
    /// <summary>The end position for our blue box.</summary>
    public Vector3 lerpUnclampedTarget = new Vector3(5, 3, 0);

    /// <summary>The current fraction to increment our lerp functions by.</summary>
    public float lerpFraction = 0;

    private void Update()
    {
        // First, I increment the lerp fraction. 
        // delaTime * 0.25 should give me a value of +1 every second.
        lerpFraction += (Time.deltaTime * 0.25f);

        // Next, we apply the new lerp values to the target transform position.
        lerpObject.transform.position 
            = Vector3.Lerp(lerpStart, lerpTarget, lerpFraction);
        lerpUnclampedObject.transform.position 
            = Vector3.LerpUnclamped(lerpUnclampedStart, lerpUnclampedTarget, lerpFraction);
    }
}

The red box moves to the target position, and stops. The blue box continues moving, indefinitely.



MoveTowards

MoveTowards के समान व्यवहार करती है Lerp ; मुख्य अंतर यह है कि हम दो बिंदुओं के बीच एक अंश के बजाय, स्थानांतरित करने के लिए एक वास्तविक दूरी प्रदान करते हैं। यह नोट करना महत्वपूर्ण है कि MoveTowards लक्ष्य अतीत का विस्तार नहीं होगा Vector3

LerpUnclamped साथ बहुत पसंद है, हम लक्ष्य Vector3 से दूर जाने के लिए एक नकारात्मक दूरी मान प्रदान कर सकते हैं। ऐसे मामलों में, हम कभी भी लक्ष्य Vector3 को आगे नहीं Vector3 , और इस तरह आंदोलन अनिश्चित है। इन मामलों में, हम लक्ष्य Vector3 को "विपरीत दिशा" के रूप में Vector3 सकते हैं; जब तक Vector3 एक ही दिशा में इंगित करता है, प्रारंभ Vector3 सापेक्ष, नकारात्मक आंदोलन को सामान्य के रूप में व्यवहार करना चाहिए।


निम्न स्क्रिप्ट MoveTowards का उपयोग MoveTowards ऑब्जेक्ट्स के एक समूह को ले जाने के लिए MoveTowards का उपयोग करता है।

using UnityEngine;
    
public class MoveTowardsExample : MonoBehaviour
{
    /// <summary>The red cube will move up, the blue cube will move down, 
    /// the green cube will move left and the yellow cube will move right.
    /// These objects will be linked via the inspector.</summary>
    public GameObject upCube, downCube, leftCube, rightCube;
    /// <summary>The cubes should move at 1 unit per second.</summary>
    float speed = 1f;

    void Update()
    {
        // We determine our distance by applying a deltaTime scale to our speed.
        float distance = speed * Time.deltaTime;

        // The up cube will move upwards, until it reaches the 
        //position of (Vector3.up * 2), or (0, 2, 0).
        upCube.transform.position 
            = Vector3.MoveTowards(upCube.transform.position, (Vector3.up * 2f), distance);

        // The down cube will move downwards, as it enforces a negative distance..
        downCube.transform.position
            = Vector3.MoveTowards(downCube.transform.position, Vector3.up * 2f, -distance);

        // The right cube will move to the right, indefinetly, as it is constantly updating
        // its target position with a direction based off the current position.
        rightCube.transform.position = Vector3.MoveTowards(rightCube.transform.position, 
            rightCube.transform.position + Vector3.right, distance);

        // The left cube does not need to account for updating its target position, 
        // as it is moving away from the target position, and will never reach it.
        leftCube.transform.position
            = Vector3.MoveTowards(leftCube.transform.position, Vector3.right, -distance);
    }
}

All cubes move outwards from the center, with the red cube stopping at its target destination.



SmoothDamp

SmoothDamp को MoveTowards में निर्मित MoveTowards एक संस्करण के रूप में MoveTowards । आधिकारिक दस्तावेज़ीकरण के अनुसार, इस फ़ंक्शन का उपयोग आमतौर पर निम्नलिखित चिकनी कैमरा करने के लिए किया जाता है।

Vector3 निर्देशांक शुरू और लक्ष्य के साथ-साथ, हमें वेग का प्रतिनिधित्व करने के लिए एक Vector3 भी प्रदान करना चाहिए, और आंदोलन को पूरा करने के लिए अनुमानित समय का प्रतिनिधित्व करने वाला एक float होना चाहिए। पिछले उदाहरणों के विपरीत, हम एक संदर्भ के रूप में, आंतरिक रूप से, वृद्धि के लिए वेग प्रदान करते हैं। इस बात पर ध्यान देना महत्वपूर्ण है, क्योंकि फ़ंक्शन के बाहर वेग बदलते समय हम अभी भी कार्य कर रहे हैं अवांछित परिणाम हो सकते हैं।

आवश्यक चर के अलावा, हम अपनी वस्तु की अधिकतम गति का प्रतिनिधित्व करने के लिए एक float भी प्रदान कर सकते हैं, और ऑब्जेक्ट के लिए पिछले SmoothDamp कॉल के बाद से समय अंतराल का प्रतिनिधित्व करने के लिए एक float । हमें इन मूल्यों को प्रदान करने की आवश्यकता नहीं है ; डिफ़ॉल्ट रूप से, कोई अधिकतम गति नहीं होगी, और समय अंतराल की व्याख्या Time.deltaTime रूप में की Time.deltaTime । इससे भी महत्वपूर्ण बात, यदि आप फ़ंक्शन को एक प्रति ऑब्जेक्ट एक MonoBehaviour.Update() फ़ंक्शन के अंदर बुला रहे हैं, तो आपको समय अंतराल घोषित करने की आवश्यकता नहीं होनी चाहिए।


using UnityEngine;
    
public class SmoothDampMovement : MonoBehaviour
{
    /// <summary>The red cube will imitate the default SmoothDamp function. 
    /// The blue cube will move faster by manipulating the "time gap", while 
    /// the green cube will have an enforced maximum speed. Note that these 
    /// objects have been linked via the inspector.</summary>
    public GameObject smoothObject, fastSmoothObject, cappedSmoothObject;

    /// <summary>We must instantiate the velocities, externally, so they may 
    /// be manipulated from within the function. Note that by making these 
    /// vectors public, they will be automatically instantiated as Vector3.Zero 
    /// through the inspector. This also allows us to view the velocities, 
    /// from the inspector, to observe how they change.</summary>
    public Vector3 regularVelocity, fastVelocity, cappedVelocity;

    /// <summary>Each object should move 10 units along the X-axis.</summary>
    Vector3 regularTarget = new Vector3(10f, 0f);
    Vector3 fastTarget = new Vector3(10f, 1.5f);
    Vector3 cappedTarget = new Vector3(10f, 3f);

    /// <summary>We will give a target time of 5 seconds.</summary>
    float targetTime = 5f;

    void Update()
    {
        // The default SmoothDamp function will give us a general smooth movement.
        smoothObject.transform.position = Vector3.SmoothDamp(smoothObject.transform.position,
            regularTarget, ref regularVelocity, targetTime);

        // Note that a "maxSpeed" outside of reasonable limitations should not have any 
        // effect, while providing a "deltaTime" of 0 tells the function that no time has 
        // passed since the last SmoothDamp call, resulting in no movement, the second time.
        smoothObject.transform.position = Vector3.SmoothDamp(smoothObject.transform.position,
            regularTarget, ref regularVelocity, targetTime, 10f, 0f);

        // Note that "deltaTime" defaults to Time.deltaTime due to an assumption that this 
        // function will be called once per update function. We can call the function 
        // multiple times during an update function, but the function will assume that enough
        // time has passed to continue the same approximate movement. As a result, 
        // this object should reach the target, quicker.
        fastSmoothObject.transform.position = Vector3.SmoothDamp(
            fastSmoothObject.transform.position, fastTarget, ref fastVelocity, targetTime);
        fastSmoothObject.transform.position = Vector3.SmoothDamp(
            fastSmoothObject.transform.position, fastTarget, ref fastVelocity, targetTime);

        // Lastly, note that a "maxSpeed" becomes irrelevant, if the object does not 
        // realistically reach such speeds. Linear speed can be determined as 
        // (Distance / Time), but given the simple fact that we start and end slow, we can 
        // infer that speed will actually be higher, during the middle. As such, we can
        // infer that a value of (Distance / Time) or (10/5) will affect the 
        // function. We will half the "maxSpeed", again, to make it more noticeable.
        cappedSmoothObject.transform.position = Vector3.SmoothDamp(
            cappedSmoothObject.transform.position, 
            cappedTarget, ref cappedVelocity, targetTime, 1f);
    }
}

We can alter the speed at which the object reaches the target by adjusting the maxSpeed and deltaTime parameters.



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow