मेरे पास एक टॉप डाउन यूनिटी प्रोजेक्ट है। प्लेयर वहां जाता है जहां स्क्रीन टैप की जाती है।

मैं चाहूंगा कि खिलाड़ी जिस दिशा में आगे बढ़ रहा है, उसके लिए सही एनिमेशन प्ले हो। मैंने ब्लेंड ट्री की स्थापना की है जो ठीक काम करता है और मेरे पास क्षैतिज, लंबवत और परिमाण के फ्लोट पैरामीटर हैं।

हालाँकि जब मैंने स्क्रीन को टैप किया तो खिलाड़ी एनीमेशन दिशा नहीं बदलता है या यदि यह गलत दिशा में आंदोलन के माध्यम से आधे रास्ते की ओर इशारा करता है। मुझे यकीन है कि यह XY मान है जिसका मैं उपयोग कर रहा हूं लेकिन मुझे यकीन नहीं है कि सही कैसे प्राप्त करें।

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour {

    float speed = 2f;
    Vector2 targetPos;

    private Rigidbody2D myRigidbody;
    private Animator myAnim;

    private void Start()
    {
        myRigidbody = GetComponent<Rigidbody2D>();
        myAnim = GetComponent<Animator>();
        targetPos = transform.position;
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            targetPos = (Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition);
        }
        if ((Vector2)transform.position != targetPos)
        {
            Move();
        }
    }

    void Move()
    {
        transform.position = Vector2.MoveTowards(transform.position, targetPos, speed * Time.deltaTime);

        myAnim.SetFloat("Horizontal", transform.position.x);
        myAnim.SetFloat("Vertical", transform.position.y);
        myAnim.SetFloat("Magnitude", transform.position.magnitude);
    }
}
0
Keith Power 19 नवम्बर 2018, 21:04

1 उत्तर

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

आपको स्थानांतरित की गई दिशा के अनुसार फ़्लोट्स सेट करने की आवश्यकता है, न कि परिवर्तन की नई स्थिति के अनुसार। ऐसा करने के लिए, आपको नई स्थिति और पुरानी स्थिति के बीच अंतर खोजने की आवश्यकता है, और इसके बजाय उस वेक्टर का उपयोग करें।

इसके अलावा, चूंकि आप परिमाण को अलग से सौंप रहे हैं, आप घटकों के लिए गति वेक्टर को सामान्य बनाना चाह सकते हैं। यह इस बात पर निर्भर करता है कि आपके मिश्रण कैसे सेट किए जाते हैं।

हालाँकि, यदि आपका आंदोलन आपको लक्ष्य की स्थिति में ले जाता है, तो आप इसके बजाय परिमाण को शून्य पर सेट करना चाहेंगे।

void Move()
{
    Vector2 oldPos = transform.position;
    transform.position = Vector2.MoveTowards(transform.position, targetPos, speed * Time.deltaTime);

    Vector2 movement = transform.position - oldPos;

    if (transform.position == targetPos) 
    {
        myAnim.SetFloat("Magnitude", 0f);
    } 
    else 
    {
        myAnim.SetFloat("Magnitude", movement.magnitude);
    }

    # You may need to normalize for your components.
    # Vector2 movementNormed = movement.normalized;
    # myAnim.SetFloat("Horizontal", movementNormed.x);
    # myAnim.SetFloat("Vertical", movementNormed.y);

    # Otherwise, just use the ordinary components.
    myAnim.SetFloat("Horizontal", movement.x);
    myAnim.SetFloat("Vertical", movement.y);

}
1
Ruzihm 20 नवम्बर 2018, 15:46