我看到你遇到的问题了。这里是翻译后的内容:
我最近在开发一款基于棋盘游戏的游戏,最近发现了一个奇怪的BUG。如果我按照特定的序列进行移动,一些棋子无法再移动。使用棋盘符号的人可能知道,移动序列是Nc3 d5,NF3 d4,Ne4 e5,Nxe5 f5,之后骑士无法再移动。
奇怪的是,我已经找到了问题的原因,但不知道为什么会这样。当我点击骑士时,程序会注册一个点击,但实际上是点击了棋盘后面的方格,尽管棋子在更高的层级上。即使我在骑士上方放置另一个白色棋子,也可以移动它,这是不应该的。
另外一个奇怪的是,如果黑方先移动,然后重复相同的序列,BUG就不会出现。
我正在失去理智,求求你们帮我解决这个问题。
以下是你的代码:
using System;
using UnityEngine;
using UnityEngine.InputSystem;
using System.Collections;
using System.Collections.Generic;
public class PieceClick : MonoBehaviour
{
// Variables
public Lists lists;
public GameObject pieceg;
public Piece piecef;
public TurnTracker turnTracker;
public List<GameObject> Pieces = new List<GameObject>();
Camera cam;
private void Awake()
{
lists.Pieces.Clear();
cam = Camera.main;
}
public void MouseClick(InputAction.CallbackContext click)
{
// Detects if a piece is clicked
if (click.performed)
{
// Detects if a piece is clicked
var hit = Physics2D.GetRayIntersection(cam.ScreenPointToRay(Mouse.current.position.ReadValue()));
GameObject collider = hit.collider.gameObject;
if (collider == pieceg)
{
if ((turnTracker.whiteturn == true && piecef.team == 0) || (turnTracker.whiteturn == false && piecef.team == 1))
{
// Deselects piece
if (piecef.isSelected == true)
{
Debug.Log("Deselect!");
lists.Pieces.RemoveAt(0);
piecef.isSelected = false;
}
// Selects piece
else if (piecef.isSelected == false)
{
// Detects if there is already a piece selected
if (lists.Pieces.Count == 1)
{
lists.Pieces[0].isSelected = false;
lists.Pieces.RemoveAt(0);
lists.Pieces.Insert(0, piecef);
Debug.Log(lists.Pieces.Count);
piecef.isSelected = true;
}
else
{
lists.Pieces.Insert(0, piecef);
Debug.Log(lists.Pieces.Count);
piecef.isSelected = true;
}
}
}
}
// Attempts to take an enemy piece
else if (lists.Pieces[0] != null)
{
// Detects if selected piece can move onto space
bool mc = lists.Pieces[0].MoveCheck(pieceg.transform.position.x, pieceg.transform.position.y, lists.Pieces[0].transform.position.x, lists.Pieces[0].transform.position.y, true);
if (mc == true)
{
// Takes piece
lists.Pieces[0].transform.position = piecef.transform.position;
Destroy(pieceg);
lists.Pieces[0].isSelected = false;
lists.Pieces.RemoveAt(0);
turnTracker.TurnChange();
}
else
{
Debug.Log("Invalid");
}
}
}
}
}
public class SquareClick : MonoBehaviour
{
// Variables
public Lists lists;
public TurnTracker turnTracker;
Camera cam;
public GameObject square;
private void Awake()
{
cam = Camera.main;
}
public void MouseClick(InputAction.CallbackContext click)
{
// Detects if square is clicked
if (click.performed)
{
// Detects if square is clicked
var hit = Physics2D.GetRayIntersection(cam.ScreenPointToRay(Mouse.current.position.ReadValue()));
GameObject sq = hit.collider.gameObject;
if (sq == square)
{
Debug.Log("Square");
// Detects if selected piece can move onto space
bool mc = lists.Pieces[0].MoveCheck(square.transform.position.x, square.transform.position.y, lists.Pieces[0].transform.position.x, lists.Pieces[0].transform.position.y, false);
if (mc == true)
{
lists.Pieces[0].transform.position = square.transform.position;
lists.Pieces[0].isSelected = false;
lists.Pieces.Clear();
turnTracker.TurnChange();
}
else
{
Debug.Log("invalid");
}
}
}
}
}
public class Knight : Piece
{
public Lists lists;
public override bool MoveCheck(float sx, float sy, float px, float py, bool isTaking)
{
bool mc;
float xdif = Mathf.Abs(sx - px);
float ydif = Mathf.Abs(sy - py);
if ((xdif == 2 && ydif == 1) || (xdif == 1 && ydif == 2))
{
mc = true;
}
else
{
mc = false;
}
return mc;
}
}
我认为问题可能出在PieceClick类的MouseClick方法中,特别是当检测到棋子被点击时。可能是由于摄像机的视角问题导致点击事件被注册在棋子后面的方格上。
评论 (0)