Я хочу закрепить каждый экземпляр одного и того же сборного только на оси у - PullRequest
0 голосов
/ 15 октября 2019

Я дважды создал экземпляр префаба paddle, затем попытался закрепить его на оси y, используя Mathf.Clamp.

Однако значения min и max в итоге применяются к обоим экземплярам paddle и, следовательно, они могут двигаться по оси x

хорошо, поэтому я пытаюсь создать 2-мерную мобильную игру в понг, у меня есть префаб paddle, представляющий собой ракетки / летучих мышей, с которыми сталкиваются шары.

Я создал один и тот же префаб дважды по одному на каждой стороне экрана:

Paddle paddle1 = Instantiate(Paddle) as Paddle;
Paddle paddle2 = Instantiate(Paddle) as Paddle;
paddle2.Init(true); //right paddle
paddle1.Init(false); //left paddle

Теперь я хочу, чтобы каждый из лопастей мог двигаться только по оси Y (ВВЕРХ И ВНИЗ).

Поэтому я попытался зажать их с помощью:

var poss = transform.position;
poss.x =  Mathf.Clamp(transform.position.x, -1.0f, 1.0f);
transform.position = poss;   

Однако это привело к тому, что левая лопасть все еще могла двигаться вправо, а правая - слева. (Я не хочу, чтобы они вообще двигались по оси).

это файл Gamemanager.cs:

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

public class GameManager: MonoBehaviour
{
    public Ball Ball; 
    public Paddle Paddle;

    public static Vector2 topRight;    
    public static Vector2 bottomLeft;

    // Start is called before the first frame update
    void Start() 
    {
        bottomLeft = Camera.main.ScreenToWorldPoint(new Vector2 (0,0));
        topRight = Camera.main.ScreenToWorldPoint(new Vector2(Screen.width,Screen.height));        

        Instantiate(Ball); 

        //Paddle paddle1 = Instantiate(Paddle) as Paddle;
        Paddle paddle1 = Instantiate(Paddle) as Paddle;
        Paddle paddle2 = Instantiate(Paddle) as Paddle;
        paddle2.Init(true); //right paddle
        paddle1.Init(false); //left paddle
    }

    void Update() 
    {

    }
}  

Это файл paddle.cs:

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

public class Paddle : MonoBehaviour
{
    Rigidbody2D rb;
    float directionY;
    float speed;
    float height;

    float distance;
    string input;  
    bool isRight;

    // Start is called before the first frame update
    void Start()
    {
        height = transform.localScale.y;
        speed=5f;   
    }

    public void Init(bool isRightPaddle)
    {
        isRight = isRightPaddle;
        Vector2 pos = Vector2.zero;     

        if(isRightPaddle)
        {
            //Place paddle on the right of the screen
            pos = new Vector2(GameManager.topRight.x, 0);
            pos -= Vector2.right * transform.localScale.x; //Move a bit to the left   
        }
        else 
        {  
            //Place paddle on the left of the screen
            pos = new Vector2(GameManager.bottomLeft.x, 0);
            pos += Vector2.right * transform.localScale.x; //Move a bit to the right   
        } 

        //Update this paddle's position
        transform.position = pos;              
    }

    void Update()
    {
        var poss = transform.position;
        poss.x =  Mathf.Clamp(transform.position.x, -8.0f, 8.0f);
        transform.position = poss; 
    }
}

Я ожидаю, что каждое весло не сможет двигатьсяпо оси х. Только по оси Y

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Если вы хотите полностью заморозить ось, а не зажать ее, вы должны сделать что-то вроде

private float xPosition;

...

public void Init(bool isRightPaddle)
{
    ...

    xPosition = pos.x;
}

Затем непрерывно возвращаться в это положение в X

// is executed after all Update methods are done
// so more or less the last thing before the frame is renderd
private void LateUpdate()
{
    transform.position = new Vector2(xPosition, transform.position.y);
}

Или, может быть, так какRigidbody2D задействовано - скорее сделайте это в

private void FixedUpdate()
{
    rb.position = new Vector2(xPosition, rb.position.y);
}
0 голосов
/ 15 октября 2019

Хаком может быть добавление твердого тела в ваш префаб, удаление любых модификаторов силы тяжести, которые по умолчанию используется компонентом твердого тела. Кроме того, есть флажок, который можно поставить, чтобы зафиксировать положение «x» игрового объекта, что должно дать вам желаемые результаты.

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