Es funktioniert, aber nicht richtig. Wenn ich mit der Maus über eine bestimmte Kachel fahre, wird das Raster nicht sichtbar, während andere einwandfrei funktionieren.
Das ist mein Code. FiniteStateMachine ist eine einfache Klasse, die von MonoBehaviour erbt.
Code: Select all
public class grid_visualization : FiniteStateMachine
{
public int x;
public int y;
public float alpha;
public GameObject tilePrefab;
public GameObject[,] grid;
public float tileSize = 1f;
private idle idleState;
private alert alertState;
void Awake()
{
grid = new GameObject[y,x];
generateVisualGrid();
idleState = new idle(gameObject);
alertState = new alert(gameObject);
currentState = idleState;
currentState.onEnter();
}
void Update()
{
currentState.onUpdate();
}
private void generateVisualGrid()
{
if (tilePrefab == null)
{
Debug.LogWarning("tile prefab is needed");
return;
}
float centerAlignmentCorrection_x = (x * tileSize / 2);
float centerAlignmentCorrection_y = (y * tileSize / 2);
float tileSizeCorrection = tileSize / 2;
for (int i = 0; i < y; i++)
{
for (int j = 0; j < x; j++)
{
Vector3 worldPosition = new Vector3(j * tileSize - centerAlignmentCorrection_x + tileSizeCorrection,
-i * tileSize + centerAlignmentCorrection_y - tileSizeCorrection, 0)
+ transform.position;
GameObject tile = Instantiate(tilePrefab, worldPosition, Quaternion.identity, transform);
tile.name = $"Tile_{j}_{i}";
grid[i,j] = tile;
}
}
}
void OnMouseEnter()
{
changeState(alertState);
}
void OnMouseExit()
{
changeState(idleState);
}
public void hideGrid()
{
for (int i = 0; i < y; i++)
{
for (int j = 0; j < x; j++)
{
SpriteRenderer gridSprite = grid[i,j].GetComponent();
gridSprite.color = new Color(1,1,1, 0);
}
}
}
public void showGrid()
{
for (int i = 0; i < y; i++)
{
for (int j = 0; j < x; j++)
{
SpriteRenderer gridSprite = grid[i,j].GetComponent();
gridSprite.color = new Color(1,1,1, alpha);
}
}
}
}
public abstract class state
{
public GameObject stateMachine;
public state(GameObject stateMachine)
{
this.stateMachine = stateMachine;
}
public abstract void onEnter();
public abstract void onUpdate();
public abstract void onExit();
}
public abstract class gridState : state
{
public grid_visualization script;
public gridState(GameObject stateMachine) : base(stateMachine)
{
script = stateMachine.GetComponent();
}
}
public class idle : gridState
{
public idle(GameObject stateMachine) : base(stateMachine)
{
}
public override void onEnter()
{
script.hideGrid();
}
public override void onUpdate()
{
}
public override void onExit()
{
}
}
public class alert : gridState
{
public alert(GameObject stateMachine) : base(stateMachine)
{
}
public override void onEnter()
{
script.showGrid();
}
public override void onUpdate()
{
}
public override void onExit()
{
}
}
Wenn Sie in den Ruhezustand wechseln, rufen Sie die Funktion hideGrid() auf. vom endlichen Zustandsautomaten (
Code: Select all
grid_visualizationBeim Eintritt in den Alarmstatus ruft der Status showGrid() auf und macht das Raster sichtbar.
Ich habe das so gemacht, dass der Code Raycasting nur ausführt, wenn sich die Maus auf dem Raster befindet (Alarmstatus). Daher führt der Code kein Raycasting für jeden Frame aus, egal wo sich die Maus befindet. Und das liegt daran, dass ich eine einzelne Kachel hervorheben wollte, über der sich die Maus befindet.
Beim ersten Versuch habe ich versucht, eine if-Anweisung zu verwenden. Es führte zwar Raycasting für jedes Bild aus, funktionierte aber größtenteils.
Aber wenn ich meine Maus sehr schnell über das Raster bewege, fing es an zu flackern. Wenn ich mit der Maus von einer Kachel zur anderen fahre, wird die hervorgehobene Kachel weiß und zeigt dann den gewünschten Alphawert von 0,2f an.
Es könnte einfach an meiner Codelogik liegen, aber ich bin trotzdem auf einen endlichen Zustandsautomaten umgestiegen.
Zum besseren Verständnis dieses Problems finden Sie hier einen Screenshot. Die äußere Zeile ist der Collider zum Auslösen der OnMouseEnter()-Ereignisfunktion. Und das Gitter darin ist ein Collider aus vorgefertigten Kacheln mit einem Raster der Größe 4*6.

Wenn Sie den Mauszeiger über die von mir markierten Kacheln bewegen, bleibt das Gitter einfach unsichtbar. Aber wenn Sie mit der Maus über eine andere Kachel fahren, wird das Raster sichtbar, wie im Screenshot gezeigt.
Hier sind andere Dinge, die ich versucht habe:
- Anpassen der Größe des äußeren Box-Colliders, der dazu führt, dass die Kacheln weiß werden
- Aktivieren Sie „Ist Auslöser“ und deaktivieren Sie es.
- Entfernen des Box-Colliders aus der Kachel-Fabrik (das löst irgendwie das Problem, aber wenn ich es tue Daher kann ich die Hervorhebungsfunktion nicht implementieren)
Mobile version