Как вызвать метод, принадлежащий другому классу, при прокрутке вверх, вниз, влево или вправо? Unity2D - PullRequest
2 голосов
/ 11 июля 2020

У меня есть проект Unity, который я начал через пару дней go. Это простая двухмерная стрелялка сверху вниз, в которую можно играть на платформах смартфонов.

У меня есть сценарий стрельбы, в котором есть метод под названием Shoot1, который появляется в виде пули.

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

public class Shooting : MonoBehaviour
{
    public Transform firePoint;
    public GameObject BulletRedPrefab;
    public GameObject BulletGreenPrefab;
    public float bulletForce = 20f;
    // Update is called once per frame
    void Start()
    {

    }

    void Update()
    {

    }

    public IEnumerator Shoot1()
    {
        yield return new WaitForSeconds(0.00001f);
        GameObject bullet = Instantiate(BulletRedPrefab, firePoint.position, firePoint.rotation);
        Rigidbody2D rb = bullet.GetComponent<Rigidbody2D>();
        rb.AddForce(firePoint.up * bulletForce, ForceMode2D.Impulse);
    }
}

У меня также есть скрипт Swipe, который определяет направление движения, et c.

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

public class Swipe : MonoBehaviour
{
    private bool tap, swipeUp, swipeDown, swipeLeft, swipeRight;
    private bool isDraging = false;
    private Vector2 startTouch, swipeDelta;
    // Update is called once per frame
    private void Update()
    {
        tap = swipeUp = swipeDown = swipeLeft = swipeRight = false;
        if (Input.touches.Length > 0)
        {
            if (Input.touches[0].phase == TouchPhase.Began)
            {
                isDraging = true;
                tap = true;
                startTouch = Input.touches[0].position;
            }
            else if (Input.touches[0].phase == TouchPhase.Ended || Input.touches[0].phase == TouchPhase.Canceled)
            {
                isDraging = false;
                Reset();
            }
        }

        if (Input.GetMouseButtonDown(0))
        {
            tap = true;
            isDraging = true;
            startTouch = Input.mousePosition;
        }
        else if (Input.GetMouseButtonUp(0))
        {
            isDraging = false;
            Reset();
        }

        swipeDelta = Vector2.zero;

        if (isDraging)
        {
            if (Input.touches.Length > 0)
                swipeDelta = Input.touches[0].position - startTouch;
            else if (Input.GetMouseButton(0))
                swipeDelta = (Vector2)Input.mousePosition - startTouch;
        }

        if (swipeDelta.magnitude > 125)
        {
            float x = swipeDelta.x;
            float y = swipeDelta.y;
            if (Mathf.Abs(x) > Mathf.Abs(y))
            {
                if (x < 0)
                    swipeLeft = true;
                else
                    swipeRight = true;
            }
            else
            {
                if (y < 0)
                    swipeDown = true;
                else
                    swipeUp = true;
            }
            Reset();
        }
    }

    private void Reset()
    {
        startTouch = swipeDelta = Vector2.zero;
        isDraging = false;
    }

    public Vector2 SwipeDelta { get { return swipeDelta; } }
    public bool SwipeUp { get { return swipeUp; } }
    public bool SwipeDown { get { return swipeDown; } }
    public bool SwipeLeft { get { return swipeLeft; } }
    public bool SwipeRight { get { return swipeRight; } }
}

И у меня есть скрипт GestureDetector, который направлен на то, чтобы стрелять пулей всякий раз, когда пользователь проводит влево, вправо, вверх или вниз. Когда я попытался заставить объект игрока (который называется роботом) перемещаться с помощью свайпа, это сработало. Но когда я пытаюсь вызвать метод из другого класса с помощью считывания, он не работает.

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

public class GestrueDetector : MonoBehaviour
{
    public Shooting other;
    public Swipe swipeControls;
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    private void Update()
    {
        if (GameObject.Find("robot") != null)
        {
            if (swipeControls.SwipeLeft)
                desirePosition += Vector3.left;
            other.Shoot1();

            if (swipeControls.SwipeRight)
                desirePosition += Vector3.right;
            other.Shoot1();

            if (swipeControls.SwipeUp)
                desirePosition += Vector3.up;
            other.Shoot1();

            if (swipeControls.SwipeDown)
                desirePosition += Vector3.down;
            other.Shoot1();
        }
    }
}

Я только начал использовать единство на этой неделе, поэтому я новичок в этом программном обеспечении. Спасибо большое!

1 Ответ

1 голос
/ 11 июля 2020

Для сопрограмм вам нужно вызывать эти методы следующим образом:

StartCoroutine(Shoot1());

Я немного изменил ваши классы:

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

public class Shooting : MonoBehaviour
{
    public Transform firePoint;
    public GameObject BulletRedPrefab;
    public GameObject BulletGreenPrefab;
    public float bulletForce = 20f;

    void Start ()
    {
    }

    void Update()
    {
    }

    public void Shoot()
    {
       StartCoroutine(Shoot1());
    }

    private IEnumerator Shoot1()
    {
        yield return new WaitForSeconds(0.00001f);
        GameObject bullet = Instantiate(BulletRedPrefab, firePoint.position, firePoint.rotation);
        Rigidbody2D rb = bullet.GetComponent<Rigidbody2D>();
        
        rb.AddForce(firePoint.up * bulletForce, ForceMode2D.Impulse);
    }
}

А для GestrueDetector:

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

public class GestrueDetector : MonoBehaviour
{
public Shooting other;

public Swipe swipeControls;

   
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
   private void Update()
    {

        if (GameObject.Find("robot") != null)
{
    
        if (swipeControls.SwipeLeft)
            desirePosition += Vector3.left;
              other.Shoot();    

        if (swipeControls.SwipeRight)
            desirePosition += Vector3.right;
              other.Shoot();

            if (swipeControls.SwipeUp)
            desirePosition += Vector3.up;
            other.Shoot();
                 

                  

            if (swipeControls.SwipeDown)
            desirePosition += Vector3.down;
            other.Shoot();
                  

                  


}
        }
    }

Просто прочтите больше о том, как сопрограммы работают в Unity - https://docs.unity3d.com/ScriptReference/Coroutine.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...