Pattern<GameObjectTile> GetOrCreatePattern(GameObjectTile tile) { if (_patterns.TryGetValue(tile.Prefab, out var pattern)) return pattern; if (tile.Prefab == BoundaryTile) return BoundaryPattern; var weight = 1f; if (tile.Prefab.GetComponent<TileWeight>() is TileWeight tileWeight && tileWeight) weight = tileWeight.Weight; var newPattern = new Pattern<GameObjectTile>(tile.Prefab, NeighborOffset.Length, weight); _patterns.Add(tile.Prefab, newPattern); return newPattern; }
private void OnScene(SceneView obj) { if (_selectedTile) { Handles.color = Color.cyan; Handles.DrawWireCube(_selectedTile.Position + (Vector3.one / 2), Vector3.one); } if (_editMode == EditMode.None) { return; } HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Passive)); var ev = Event.current; if (!(ev.type == EventType.MouseDown && ev.button == 0)) { return; } if (_editMode == EditMode.Pick && _palette) { var ray = HandleUtility.GUIPointToWorldRay(ev.mousePosition); _selectedTile = _palette.RayMarch(ray, 100); _editMode = EditMode.Paint; ev.Use(); } else if (_editMode == EditMode.Paint && _editingGameObjectTilemap && _selectedTile) { var ray = HandleUtility.GUIPointToWorldRay(ev.mousePosition); var tile = _editingGameObjectTilemap.RayMarch(ray, 100, out var hitPos, out var normal); Vector3Int pos; if (tile) { pos = hitPos + normal; } else { pos = (ray.origin + ray.direction * (-ray.origin.y / ray.direction.y)).FloorToVector3Int(); } // var tobj = new GameObject(); // var test = tobj.AddComponent<TestRayMarching>(); // var objFrom = new GameObject(); // var objTo = new GameObject(); // test.From = objFrom.transform; // test.To = objTo.transform; // objFrom.transform.position = ray.origin; // objTo.transform.position = ray.origin + ray.direction * 100; // tile.gameObject.name = "F**k"; _editingGameObjectTilemap.SetTile(pos, _selectedTile); } else if (_editMode == EditMode.Erase && _editingGameObjectTilemap) { var ray = HandleUtility.GUIPointToWorldRay(ev.mousePosition); var tile = _editingGameObjectTilemap.RayMarch(ray, 100, out var hitPos, out _); if (tile) { _editingGameObjectTilemap.RemoveTile(hitPos); } } }