【发布时间】:2021-05-26 22:43:12
【问题描述】:
我想编写一个井字游戏,但遇到了我的第一个问题:
我想从这个脚本中转移 int 变量“Level”:
using UnityEngine;
public class Box : MonoBehaviour
{
public int index;
public Mark mark;
public bool isMarked;
public static int Level;
// [SerializeField] public int Level;
private SpriteRenderer spriteRenderer;
private void Awake()
{
spriteRenderer = GetComponent<SpriteRenderer>();
index = transform.GetSiblingIndex () ;
mark = Mark.None;
isMarked = false;
Level = 0;
}
public void SetAsMarked (Sprite sprite, Mark mark, Color color)
{
this.mark = mark;
Level = Level + 1;
if (Level == 2)
{
isMarked = true;
GetComponent<CircleCollider2D>().enabled = false;
}
spriteRenderer.sprite = sprite;
spriteRenderer.color = color;
}
}
进入这个脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Board : MonoBehaviour
{
[Header("Input Settings : ")]
[SerializeField] private LayerMask boxesLayerMask;
[SerializeField] private float touchRadius;
[Header("Mark Sprites : ")]
[SerializeField] private Sprite spriteX;
[SerializeField] private Sprite spriteO;
[Header("Mark Colors Level 1: ")]
[SerializeField] private Color colorX;
[SerializeField] private Color colorO;
[Header("Mark Colors Level 2: ")]
[SerializeField] private Color colorX2;
[SerializeField] private Color colorO2;
public Mark[] marks;
private Camera cam;
private Mark currentMark;
private void Start()
{
cam = Camera.main;
currentMark = Mark.X;
marks = new Mark[9];
}
private void Update()
{
if (Input.GetMouseButtonUp(0))
{
Vector2 touchPosition = cam.ScreenToWorldPoint(Input.mousePosition);
Collider2D hit = Physics2D.OverlapCircle(touchPosition, touchRadius, boxesLayerMask);
if (hit)//box ist touched
HitBox(hit.GetComponent<Box>());
}
}
private void HitBox(Box box)
{
if(!box.isMarked)
marks[box.index] = currentMark;
box.SetAsMarked(GetSprite(), currentMark, GetColor());
//chek if anybody wins:
bool won = CheckIfWin();
if (won)
{
Debug.Log(currentMark.ToString() + "Wins.");
}
SwitchPlayer();
}
private bool CheckIfWin()
{
return
AreBoxesMatched (0, 1, 2) || AreBoxesMatched (3, 4, 5) ||
AreBoxesMatched (6, 7, 8) || AreBoxesMatched (0, 3, 6) ||
AreBoxesMatched (1, 4, 7) || AreBoxesMatched (0, 1, 2) ||
AreBoxesMatched (0, 4, 8) || AreBoxesMatched (2, 4, 6);
}
private bool AreBoxesMatched(int i, int j, int k)
{
Mark m = currentMark;
bool matched = (marks[i] == m && marks[j] == m && marks[k] == m) ;
return matched;
}
private void SwitchPlayer ()
{
currentMark = (currentMark == Mark.X) ? Mark.O : Mark.X ;
}
private Color GetColor()
{
if (Level == 1) // <- Here I want to get the variable from the other spript.
{
return (currentMark == Mark.X) ? colorX : colorO;
}
else
return (currentMark == Mark.X) ? colorX2 : colorO2;
}
private Sprite GetSprite ()
{
return (currentMark == Mark.X) ? spriteX : spriteO;
}
}
,我确信这是可能的,并且已经在 Internet 上进行了搜索,但还没有进展我现在必须如何使用这个脚本来执行此操作。谢谢!
【问题讨论】:
标签: c# unity3d variables tic-tac-toe