我正在关注如何制作块拼图游戏的教程:https://www.youtube.com/watch?v=RfCwLjfroMs&list=PL17UdFXqPr_cFumTzS4PvIc1mhW79umG8&index=13
除了我身边其他人遇到的问题之外,一切都很好。
问题是:由于某种原因,每次生成新块时,如果您先移动中间或左侧,右侧的块也会消失。每隔一段时间,块就会保留下来。
有些人指出,这可能是因为这些块没有返回到原来的位置,因此当我首先放置中间的块时,它会检查右侧的块是否不在原来的位置,因此它会停用它......
我尝试过其他人提出的解决方案,但没有成功。然后我尝试自己解决这个问题,但是经过 2 个小时的调试,我想我已经成功地打破了它:)。我不确定这个问题是否符合这个网站的要求和风格,但如果有人有任何想法如何解决这个问题,那么很高兴收到您的来信!
之前:
您可能需要的代码(删除了您可能不需要的部分):
形状:
public class Shape : MonoBehaviour, IPointerClickHandler, IPointerUpHandler, IBeginDragHandler,
IDragHandler, IEndDragHandler, IPointerDownHandler
{
public GameObject squareShapeImage;
public Vector3 shapeSelectedScale;
public Vector2 offset = new Vector2(0f, 700f);
[HideInInspector]
public ShapeData CurrentShapeData;
public int TotalSquareNumber { get; set; }
private List<GameObject> _currentShape = new List<GameObject>();
private Vector3 _shapeStartScale;
private RectTransform _transform;
private bool _shapeDraggable = true;
private Canvas _canvas;
private Vector3 _startPosition;
private bool _shapeActive = true;
public void Awake()
{
_shapeStartScale = this.GetComponent<RectTransform>().localScale;
_transform = this.GetComponent<RectTransform>();
_canvas = GetComponentInParent<Canvas>();
_shapeDraggable = true;
_startPosition = _transform.localPosition;
_shapeActive = true;
}
private void OnEnable()
{
GameEvents.MoveShapeToStartPosition += MoveShapeToStartPosition;
GameEvents.SetShapeInactive += SetShapeInactive;
}
private void OnDisable()
{
GameEvents.MoveShapeToStartPosition -= MoveShapeToStartPosition;
GameEvents.SetShapeInactive -= SetShapeInactive;
}
public bool IsOnStartPosition()
{
return _transform.localPosition == _startPosition;
}
public bool IsAnyOfShapeSquareActive()
{
foreach (var square in _currentShape)
{
if (square.gameObject.activeSelf)
{
return true;
}
}
return false;
}
public void DeactivateShape()
{
if (_shapeActive)
{
foreach (var square in _currentShape)
{
square?.GetComponent<ShapeSquare>().DeactivateShape();
}
}
_shapeActive = false;
}
private void SetShapeInactive()
{
if (IsOnStartPosition() == false && IsAnyOfShapeSquareActive())
{
foreach (var square in _currentShape)
{
square.gameObject.SetActive(false);
}
}
}
public void ActivateShape()
{
if (!_shapeActive)
{
foreach (var square in _currentShape)
{
square?.GetComponent<ShapeSquare>().ActivateShape();
}
}
_shapeActive = true;
}
public void RequestNewShape(ShapeData shapeData)
{
_transform.localPosition = _startPosition;
CreateShape(shapeData);
}
public void CreateShape(ShapeData shapeData)
{
CurrentShapeData = shapeData;
TotalSquareNumber = GetNumberOfSquares(shapeData);
while (_currentShape.Count <= TotalSquareNumber)
{
_currentShape.Add(Instantiate(squareShapeImage, transform) as GameObject);
}
foreach (var square in _currentShape)
{
square.gameObject.transform.position = Vector3.zero;
square.gameObject.SetActive(false);
}
var squareRect = squareShapeImage.GetComponent<RectTransform>();
var moveDistance = new Vector2(squareRect.rect.width * squareRect.localScale.x,
squareRect.rect.height * squareRect.localScale.y);
int currentIndexInList = 0;
// set positions to form a final shape
for (var row = 0; row < shapeData.rows; row++)
{
for (var column = 0; column < shapeData.columns; column++)
{
if (shapeData.board[row].column[column])
{
_currentShape[currentIndexInList].SetActive(true);
_currentShape[currentIndexInList].GetComponent<RectTransform>().localPosition =
new Vector2(GetXPositionForShapeSquare(shapeData, column, moveDistance), GetYPositionForShapeSquare(shapeData, row, moveDistance));
currentIndexInList++;
}
}
}
}
public void OnBeginDrag(PointerEventData eventData)
{
this.GetComponent<RectTransform>().localScale = shapeSelectedScale;
}
public void OnDrag(PointerEventData eventData)
{
_transform.anchorMin = new Vector2(0, 0);
_transform.anchorMax = new Vector2(0, 0);
_transform.pivot = new Vector2(0.5f, 0.5f);
Vector2 pos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(_canvas.transform as RectTransform,
eventData.position, Camera.main, out pos);
_transform.localPosition = pos + offset;
}
public void OnEndDrag(PointerEventData eventData)
{
this.GetComponent<RectTransform>().localScale = _shapeStartScale;
GameEvents.CheckIfShapeCanBePlaced();
}
public void MoveShapeToStartPosition()
{
_transform.transform.localPosition = _startPosition;
}
}
网格:
public class Grid : MonoBehaviour
{
public ShapeStorage shapeStorage;
public int columns = 0;
public int rows = 0;
public float squaresGap = 0.1f;
public GameObject gridSquare;
public Vector2 startPosition = new Vector2(0.0f, 0.0f);
public float squareScale = 0.5f;
public float everySquareOffset = 0.0f;
private Vector2 _offset = new Vector2(0.0f, 0.0f);
private List<GameObject> _gridSquares = new List<GameObject>();
private void CheckIfShapeCanBePlaced()
{
var squareIndexes = new List<int>();
foreach (var square in _gridSquares)
{
var gridSquare = square.GetComponent<GridSquare>();
if (gridSquare.Selected && !gridSquare.SquareOccupied)
{
squareIndexes.Add(gridSquare.SquareIndex);
gridSquare.Selected = false;
//gridSquare.ActivateSquare();
}
}
var currentSelectedShape = shapeStorage.GetCurrentSelectedShape();
if (currentSelectedShape == null) return; //There is no selected shape;
if (currentSelectedShape.TotalSquareNumber == squareIndexes.Count)
{
foreach (var squareIndex in squareIndexes)
{
_gridSquares[squareIndex].GetComponent<GridSquare>().PlaceShapeOnBoard();
}
var shapeLeft = 0;
foreach (var shape in shapeStorage.shapeList)
{
if (shape.IsOnStartPosition() && shape.IsAnyOfShapeSquareActive())
{
shapeLeft++;
}
}
var counter = shapeLeft;
if (shapeLeft == 0)
{
GameEvents.RequestNewShapes();
}
else
{
GameEvents.SetShapeInactive();
}
}
else
{
GameEvents.MoveShapeToStartPosition();
}
}
}
游戏活动:
public class GameEvents : MonoBehaviour
{
public static Action CheckIfShapeCanBePlaced;
public static Action MoveShapeToStartPosition;
public static Action RequestNewShapes;
public static Action SetShapeInactive;
}
形状存储:
public class ShapeStorage : MonoBehaviour
{
public List<ShapeData> shapeData;
public List<Shape> shapeList;
private void OnEnable()
{
GameEvents.RequestNewShapes += RequestNewShapes;
}
private void OnDisable()
{
GameEvents.RequestNewShapes -= RequestNewShapes;
}
void Start()
{
foreach(var shape in shapeList)
{
var shapeIndex = UnityEngine.Random.Range(0, shapeData.Count);
shape.CreateShape(shapeData[shapeIndex]);
}
}
public Shape GetCurrentSelectedShape()
{
foreach (var shape in shapeList)
{
if (shape.IsOnStartPosition() == false && shape.IsAnyOfShapeSquareActive())
{
return shape;
}
}
Debug.LogError("No shape selected");
return null;
}
private void RequestNewShapes()
{
foreach (var shape in shapeList)
{
var shapeIndex = UnityEngine.Random.Range(0, shapeData.Count); // exclusive
shape.RequestNewShape(shapeData[shapeIndex]);
}
}
}
遵循@BugFinder 的建议并在各处添加调试消息。字面上地。每行代码都有一个。根本没有帮助。愤怒了。删除所有形状并将它们粘贴回来。错误已修复。 ́_(ツ)_/́.