Esempio n. 1
0
 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;
 }
Esempio n. 2
0
        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);
                }
            }
        }