@Googoogoogoose
Geek brained

В чём ошибка внутри этого кода?

vAWX54BI1nYWnr.png
ошибка возникает на 48 строке.

l2ZXd1wIw564dr.pngKAgZykwh4ZRwg2.png
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Tetromino : MonoBehaviour 
{
	float fall = 0;

	//public float Swa;
	public float fallSpeed = 1;
	public bool allowRotation = true;
	public bool limitRotation = false;

	// variables for touch
	private int touchSensitivityHorizontal = 8;
	private int touchSensitivityVertical = 4;
	Vector2 previousUnitPosition = Vector2.zero;
	Vector2 direction = Vector2.zero;
	bool moved = false;
	
	void Start () 
	{
	
	}
	

	void Update () 
	{
		CheckUserInput();
	//	Swa = (Swa>180)?Swa-360:Swa;
	}

	
	void CheckUserInput ()
	{
		if (Input.touchCount > 0)
		{
			Touch t = Input.GetTouch(0);

			if (t.phase == TouchPhase.Began)
			{
				previousUnitPosition = new Vector2 (t.position.x, t.position.y);
			} else if (t.phase == TouchPhase.Moved)
			{
				Vector2 touchDeltaPosition = t.deltaPosition;
				direction = touchDeltaPosition.normalized;

				if (Mathf.Abs(t.position.x - previousUnitPosition.x) >= touchSensitivityHorizontal && direction < 0 && t.deltaPosition.y > -10 && t.deltaPosition.y < 10) // на этой строке ошибка direction < 0
			
			} else if (t.phase == TouchPhase.Ended)
			{

			}
		}
		if (Input.GetKeyDown(KeyCode.RightArrow)) 
		{
			transform.position += new Vector3(1, 0, 0);
			if (CheckIsValidPosition()) 
			{

				FindObjectOfType<GameScript>().UpdateGrid(this);

			} else 
			{

				transform.position += new Vector3(-1, 0, 0);
			
			}
		} else if
		 (Input.GetKeyDown(KeyCode.LeftArrow)) 
		 {
			transform.position += new Vector3(-1, 0, 0);

			if (CheckIsValidPosition()) 
			{
				FindObjectOfType<GameScript>().UpdateGrid(this);
			} else 
			{
				
				transform.position += new Vector3(1, 0, 0);
			}
		} else if (Input.GetKeyDown(KeyCode.UpArrow)) 
		{
			if (allowRotation) 
			{
				if (limitRotation) 
				{
					if (transform.rotation.eulerAngles.z >= 90) {
						transform.Rotate(0,0,-90);
					} else 
					{
						transform.Rotate(0,0,90);
					}
					} else 
					{
						transform.Rotate (0,0,90);
					}
					if(CheckIsValidPosition()) {
						FindObjectOfType<GameScript>().UpdateGrid(this);
					} else {
						if (limitRotation) {
							if (transform.rotation.eulerAngles.z >= 90) {
								transform.Rotate(0,0,-90);
							} else {
								transform.Rotate (0,0,90);
							}
						} else {
							transform.Rotate (0,0,-90);
						}
					}
				}
			} else if (Input.GetKeyDown(KeyCode.DownArrow) || Time.time - fall >= fallSpeed) {

				transform.position += new Vector3(0, -1, 0);
				
				fall = Time.time;

				if (CheckIsValidPosition()) {

				FindObjectOfType<GameScript>().UpdateGrid(this);

				} else {
					transform.position += new Vector3(0, 1, 0);
					FindObjectOfType<GameScript>().DeleteRow();
					if (FindObjectOfType<GameScript>().CheckIsAboveGrid (this))
					{
						FindObjectOfType<GameScript>().GameOver ();
					}
					enabled = false;
					FindObjectOfType<GameScript>().SpawnNextFigure();
				}
			}
		}
		bool CheckIsValidPosition () {
			foreach (Transform fig in transform) {
				Vector2 pos = FindObjectOfType<GameScript>().Round (fig.position);
				if (FindObjectOfType<GameScript>().CheckIsInsideGrid (pos) == false) {
					return false;
				}
				if (FindObjectOfType<GameScript>().GetTransformAtGridPosition(pos) != null && FindObjectOfType<GameScript>().GetTransformAtGridPosition(pos).parent != transform){
					return false;
				}
			}
			return true;
		}
}
  • Вопрос задан
  • 262 просмотра
Решения вопроса 1
lexxpavlov
@lexxpavlov
Программист, преподаватель
У вас ошибки указаны в сообщениях в студии:

1) Operator '<' cannot be applied to operand of type 'Vector2' and 'int'
direction - это Vector2, его нельзя сравнивать с числом. Нужно сравнивать direction.x < 0 или direction.y < 0 (или и то, и другое вместе, как вам нужно).

2) ; expected
После if должна быть инструкция, закончившаяся ; (или в фигурных скобках). У вас этого нет.

И прислушайтесь советов Denis Gaydak!
Если ещё можно написать такой код, как вы сделали, (хотя вы и не сделали :) ), то изменять его уже не получится - дольше времени разбираться с ним, чем исправлять.
Сделайте такие методы: ProcessTouch(Touch touch), MoveFigureBy(int value), RotateFigure(), FallFigure() и их вызывайте в CheckUserInput(). Обратите внимание, что я в старте поместил ссылку на GameScript в переменную GridObject. Это важно, потому что метод FindObjectOfType ресурсоёмкий, а у вас он вызывается несколько раз в каждом Update (то есть, десятки раз в секунду!).

Я позволил себе предложить вот такой код (я только исправил две ошибки, о которых вы говорили, и сделал рефакторинг):
GameScript GridObject;

void Start()
{
	GridObject = FindObjectOfType<GameScript>();
}

void Update () 
{
    CheckUserInput();
}

void CheckUserInput()
{
    if (Input.touchCount > 0) ProcessTouch(Input.GetTouch(0));
    if (Input.GetKeyDown(KeyCode.RightArrow)) MoveFigureBy(1);
    if (Input.GetKeyDown(KeyCode.LeftArrow)) MoveFigureBy(-1);
    if (Input.GetKeyDown(KeyCode.UpArrow)) RotateFigure();
    if (Input.GetKeyDown(KeyCode.DownArrow) || Time.time - fall >= fallSpeed) FallFigure();
}

void ProcessTouch(Touch touch)
{
    if (touch.phase == TouchPhase.Began)
    {
        previousUnitPosition = new Vector2 (touch.position.x, touch.position.y);
    } else if (touch.phase == TouchPhase.Moved)
    {
        Vector2 touchDeltaPosition = touch.deltaPosition;
        direction = touchDeltaPosition.normalized;

        if (Mathf.Abs(touch.position.x - previousUnitPosition.x) >= touchSensitivityHorizontal && direction.x < 0 &&toucht.deltaPosition.y > -10 && touch.deltaPosition.y < 10) // на этой строке ошибка direction < 0
        {
            // что делать???
        }      
    } else if (touch.phase == TouchPhase.Ended)
    {

    }
}
void MoveFigureBy(int value)
{
    transform.position += new Vector3(value, 0, 0);
    if (CheckIsValidPosition()) 
    {
        GridObject.UpdateGrid(this);
    } else 
    {
        transform.position += new Vector3(-1 * value, 0, 0);
    }
}
void RotateFigure()
{
	if (allowRotation) 
    {
        if (limitRotation) 
        {
            if (transform.rotation.eulerAngles.z >= 90) {
                transform.Rotate(0,0,-90);
            } else 
            {
                transform.Rotate(0,0,90);
            }
        } else 
        {
            transform.Rotate (0,0,90);
        }
        if(CheckIsValidPosition()) 
        {
            GridObject.UpdateGrid(this);
        } else 
        {
            if (limitRotation) 
            {
                if (transform.rotation.eulerAngles.z >= 90) 
                {
                    transform.Rotate(0,0,-90);
                } else 
                {
                    transform.Rotate (0,0,90);
                }
            } else 
            {
              transform.Rotate (0,0,-90);
            }
        }
    }
}
void FallFigure()
{
    transform.position += new Vector3(0, -1, 0);
        
    fall = Time.time;

    if (CheckIsValidPosition()) 
    {
        GridObject.UpdateGrid(this);
    } else 
    {
          transform.position += new Vector3(0, 1, 0);
          GridObject.DeleteRow();
          if (GridObject.CheckIsAboveGrid (this))
          {
              GridObject.GameOver ();
          }
          enabled = false;
          GridObject.SpawnNextFigure();
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
GavriKos
@GavriKos Куратор тега Unity
В том, что после if должен идти блок кода, выполняющийся при валидности условия. У вас его там нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы