private void FillWindow() { // Hierarchy // // -- Window // | -- container // | -- prototype // container = gameObject.GetElement <Transform>("container"); itemPrototype = gameObject.GetElement <Button>("prototype"); itemPrototype.gameObject.SetActive(ResourceUtility.Blocks.blocks.Count != 0); for (int i = 0; i < ResourceUtility.Blocks.blocks.Count; i++) { BlockResourceItem block = ResourceUtility.Blocks.blocks[i]; GameObject blockGameObject = (i == 0) ? itemPrototype.gameObject : Instantiate(itemPrototype.gameObject); Button itemButton = blockGameObject.GetComponent <Button>(); RawImage iconImage = blockGameObject.GetElement <RawImage>("icon"); Text nameText = blockGameObject.GetElement <Text>("name"); if (itemButton != null) { itemButton.onClick.AddListener(() => { BuildManager.Instance.BeginBuild((int)block.type, currentShip); Hide(); }); } if (iconImage != null) { if (block.usePreview == true) { iconImage.texture = block.preview; iconImage.uvRect = new Rect(0, 0, 1, 1); } else if (block.useAtlas == true) { iconImage.texture = ResourceUtility.atlas; iconImage.uvRect = block.uv; } } if (nameText != null) { nameText.text = (block.type).ToString(); } blockGameObject.transform.SetParent(container, false); } }
private Vector2[] GetUV(BlockResourceItem item) { if (item.useAtlas == true) { return(new Vector2[] { new Vector2(item.uv.xMin, item.uv.yMin), new Vector2(item.uv.xMin, item.uv.yMax), new Vector2(item.uv.xMax, item.uv.yMax), new Vector2(item.uv.xMax, item.uv.yMin) }); } return(ServiceData.defaultUV); }
public override void OnInspectorGUI() { BlockResourceItem item = target as BlockResourceItem; Rect uv = item.uv; Texture preview = item.preview; GameObject prefab = item.prefab; var type = (Blocks)EditorGUILayout.EnumPopup(item.type); EditorGUILayout.Space(); var width = EditorGUILayout.IntField("Width", item.Width); var height = EditorGUILayout.IntField("Height", item.Height); EditorGUILayout.Space(); var useAtlas = EditorGUILayout.Toggle("Use atlas", item.useAtlas); var usePreview = EditorGUILayout.Toggle("Use custom prewiew", item.usePreview); var usePrefab = EditorGUILayout.Toggle("Use prefab", item.usePrefab); EditorGUILayout.Space(); if (useAtlas == true) { uv = EditorGUILayout.RectField(item.uv); } if (usePreview == true) { preview = (Texture)EditorGUILayout.ObjectField("Preview", item.preview, typeof(Texture), false); } if (usePrefab == true) { prefab = (GameObject)EditorGUILayout.ObjectField("Prefab", item.prefab, typeof(GameObject), false); } if (item.type != type) { item.type = type; EditorUtility.SetDirty(item); } if (item.Width != width || item.Height != height) { item.Width = width; item.Height = height; EditorUtility.SetDirty(item); } if (item.useAtlas != useAtlas || item.uv != uv) { item.useAtlas = useAtlas; item.uv = uv; EditorUtility.SetDirty(item); } if (item.usePrefab != usePrefab || item.prefab != prefab) { item.usePrefab = usePrefab; item.prefab = prefab; EditorUtility.SetDirty(item); } if (item.usePreview != usePreview || item.preview != preview) { item.usePreview = usePreview; item.preview = preview; EditorUtility.SetDirty(item); } }
public static GameObject Build(IShipDataContainer data, IEnumerable <ShipBlock> shipBlocks) { List <int> triangles = new List <int>(); List <Vector2> uvs = new List <Vector2>(); List <Vector2> uvs2 = new List <Vector2>(); List <Vector3> vertices = new List <Vector3>(); var ship = new GameObject("Ship mesh"); var meshFilter = ship.AddComponent <MeshFilter>(); var meshRenderer = ship.AddComponent <MeshRenderer>(); float delta = 0.5F; float uv2Width = 1F / data.Bounds.width; float uv2Height = 1F / data.Bounds.height; foreach (ShipBlock block in shipBlocks) { BlockResourceItem blockResource = ResourceUtility.Blocks.GetBlock(block.ID); if (blockResource == null) { continue; } Vector3 localPosition = new Vector3(block.X, block.Y); Quaternion localRotation = Quaternion.Euler(0, 0, block.Rotation); if (blockResource.usePrefab == true && blockResource.prefab != null) { GameObject prefab = Object.Instantiate(blockResource.prefab); prefab.transform.parent = ship.transform; prefab.transform.localPosition = localPosition; prefab.transform.localRotation = localRotation; } int verticesIndex = vertices.Count; Matrix4x4 rotateMatrix = Matrix4x4.Rotate(localRotation); Rect uv = Rect.zero; Rect uv2 = new Rect((block.X - data.Bounds.x) / (float)data.Bounds.width, (block.Y - data.Bounds.y) / (float)data.Bounds.height, uv2Width, uv2Height); if (blockResource.useAtlas == true) { uv = blockResource.uv; } Vector2 uv_center = new Vector2(uv.x + uv.width * 0.5F, uv.y + uv.height * 0.5F); Vector2 uv_up = rotateMatrix.MultiplyPoint(new Vector2(0, uv.height * 0.5F)); Vector2 uv_right = rotateMatrix.MultiplyPoint(new Vector2(uv.width * 0.5F, 0)); vertices.Add(localPosition + new Vector3(-delta, -delta)); vertices.Add(localPosition + new Vector3(-delta, delta)); vertices.Add(localPosition + new Vector3(delta, delta)); vertices.Add(localPosition + new Vector3(delta, -delta)); triangles.Add(verticesIndex); triangles.Add(verticesIndex + 1); triangles.Add(verticesIndex + 2); triangles.Add(verticesIndex); triangles.Add(verticesIndex + 2); triangles.Add(verticesIndex + 3); uvs.Add(uv_center - uv_up - uv_right); uvs.Add(uv_center + uv_up - uv_right); uvs.Add(uv_center + uv_up + uv_right); uvs.Add(uv_center - uv_up + uv_right); uvs2.Add(new Vector2(uv2.xMin, uv2.yMin)); uvs2.Add(new Vector2(uv2.xMin, uv2.yMax)); uvs2.Add(new Vector2(uv2.xMax, uv2.yMax)); uvs2.Add(new Vector2(uv2.xMax, uv2.yMin)); } Mesh mesh = new Mesh(); mesh.vertices = vertices.ToArray(); mesh.triangles = triangles.ToArray(); mesh.uv = uvs.ToArray(); mesh.uv2 = uvs2.ToArray(); mesh.RecalculateNormals(); mesh.RecalculateBounds(); meshFilter.sharedMesh = mesh; meshRenderer.material = ResourceUtility.shipMaterial; return(ship); }