From 8423ddf5f79f5576014981126fad49cd272ca2b9 Mon Sep 17 00:00:00 2001 From: yjm484 <171359351@qq.com> Date: Fri, 13 Dec 2024 14:23:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=A1=E7=89=8C=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/GameDate/cardDeckList.asset | 17 +-- .../Assets/Scenes/SampleScene.unity | 64 +++++++-- .../Assets/Scripts/Card/CardDrag.cs | 4 +- .../Assets/Scripts/Card/CardEntity.cs | 14 +- .../Scripts/Card/CardOriginalDataList.cs | 2 +- .../Assets/Scripts/GameManager.cs | 25 ++++ .../Scripts/Handler/EffectRangeHandler3_1.cs | 7 +- .../Scripts/Handler/EffectRangeHandlerBase.cs | 21 +++ .../Assets/Scripts/MapManager.cs | 128 +++++++++++++++++- .../Assets/Scripts/MapUnity.cs | 22 ++- .../Assets/Scripts/Player.cs | 42 +++--- .../Scripts/{ => Servent}/MainMnue.meta | 0 .../{ => Servent}/MainMnue/MineMnueSlied.cs | 0 .../MainMnue/MineMnueSlied.cs.meta | 0 .../Assets/Scripts/Tool/MathTool.cs | 76 +++++++++++ .../Assets/Scripts/Tool/Name.cs | 2 +- .../Assets/Scripts/Tool/getNodeTools.cs | 99 ++++++++++++++ .../Assets/StreamingAssets/card_data_4.csv | 2 + .../StreamingAssets/card_data_4.csv.meta | 7 + .../Assets/data/card_data_4.csv | 16 +++ .../Assets/data/card_data_4.csv.meta | 7 + ...harp-Editor.csproj.AssemblyReference.cache | Bin 138820 -> 137297 bytes 22 files changed, 508 insertions(+), 47 deletions(-) rename ColorlessWorld-2024-4-2/Assets/Scripts/{ => Servent}/MainMnue.meta (100%) rename ColorlessWorld-2024-4-2/Assets/Scripts/{ => Servent}/MainMnue/MineMnueSlied.cs (100%) rename ColorlessWorld-2024-4-2/Assets/Scripts/{ => Servent}/MainMnue/MineMnueSlied.cs.meta (100%) create mode 100644 ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4.csv create mode 100644 ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4.csv.meta create mode 100644 ColorlessWorld-2024-4-2/Assets/data/card_data_4.csv create mode 100644 ColorlessWorld-2024-4-2/Assets/data/card_data_4.csv.meta diff --git a/ColorlessWorld-2024-4-2/Assets/GameDate/cardDeckList.asset b/ColorlessWorld-2024-4-2/Assets/GameDate/cardDeckList.asset index 7e9f2910..e3391e16 100644 --- a/ColorlessWorld-2024-4-2/Assets/GameDate/cardDeckList.asset +++ b/ColorlessWorld-2024-4-2/Assets/GameDate/cardDeckList.asset @@ -13,13 +13,10 @@ MonoBehaviour: m_Name: cardDeckList m_EditorClassIdentifier: cardDeckList: - - 1014 - - 1014 - - 1015 - - 1015 - - 1015 - - 1016 - - 1016 - - 1016 - - 1017 - - 1017 + - 1001 + - 1001 + - 1001 + - 1001 + - 1001 + - 1001 + - 1001 diff --git a/ColorlessWorld-2024-4-2/Assets/Scenes/SampleScene.unity b/ColorlessWorld-2024-4-2/Assets/Scenes/SampleScene.unity index 804099bb..34d34e65 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scenes/SampleScene.unity +++ b/ColorlessWorld-2024-4-2/Assets/Scenes/SampleScene.unity @@ -3854,6 +3854,37 @@ SphereCollider: serializedVersion: 3 m_Radius: 0.45 m_Center: {x: 0, y: 0.41, z: -2} +--- !u!1 &179913386 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 179913387} + m_Layer: 0 + m_Name: MapGeneraterTest + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &179913387 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 179913386} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -50.362644, y: -4.974493, z: 0.41015458} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1819238997} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &192780992 GameObject: m_ObjectHideFlags: 0 @@ -6205,7 +6236,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!4 &281408863 Transform: m_ObjectHideFlags: 0 @@ -7420,7 +7451,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!4 &329040649 Transform: m_ObjectHideFlags: 0 @@ -9229,7 +9260,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!114 &395072432 MonoBehaviour: m_ObjectHideFlags: 0 @@ -13008,7 +13039,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!114 &515302568 MonoBehaviour: m_ObjectHideFlags: 0 @@ -15397,7 +15428,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!114 &628364366 MonoBehaviour: m_ObjectHideFlags: 0 @@ -17936,7 +17967,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &789990414 RectTransform: m_ObjectHideFlags: 0 @@ -22026,7 +22057,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!82 &992566369 AudioSource: m_ObjectHideFlags: 0 @@ -25161,7 +25192,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!4 &1147870383 Transform: m_ObjectHideFlags: 0 @@ -28747,6 +28778,15 @@ MonoBehaviour: - Y: [] - Y: [] - Y: [] + ToolX: + - Y: [] + - Y: [] + - Y: [] + - Y: [] + - Y: [] + - Y: [] + - Y: [] + - Y: [] character: 0 playerOn: {fileID: 0} player: {fileID: 1809205617} @@ -36479,7 +36519,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!114 &1690695889 MonoBehaviour: m_ObjectHideFlags: 0 @@ -37789,7 +37829,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!114 &1751203283 MonoBehaviour: m_ObjectHideFlags: 0 @@ -39358,6 +39398,7 @@ MonoBehaviour: line: 8 column: 8 generatePoint: {fileID: 514899946} + generatePointTest: {fileID: 179913386} lineOffSet: {x: 1, y: 0, z: 0} columnOffSet: {x: 0, y: 0, z: 0.865} enemyGenerateDataList: [] @@ -40208,6 +40249,7 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 514899947} + - {fileID: 179913387} - {fileID: 1802141879} - {fileID: 1285317928} m_Father: {fileID: 0} @@ -45370,7 +45412,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!114 &2068068678 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardDrag.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardDrag.cs index 85dc5f46..807b79f5 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardDrag.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardDrag.cs @@ -418,7 +418,7 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag { //射线检测瞄准的地图节点,判断是否可放置和改变放置影响区 Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.value); - Debug.Log(Mouse.current.position.value); + //Debug.Log(Mouse.current.position.value); if (Physics.Raycast(ray, out RaycastHit raycastHit, 500, layerMask.value)) { //Debug.Log(raycastHit.collider.gameObject.name); @@ -447,7 +447,7 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag Vector3 face = currentNode.transform.position - GameManager.Instance.playerOn.transform.position; float euler = Vector3.SignedAngle(-GameManager.Instance.playerOn.transform.forward, face, GameManager.Instance.playerOn.transform.up) + 180; Debug.Log("euler是"+ euler); - getNodeTools.setEffectRangePreview(cardEntity.cardOriginalData.EffectRange, euler, currentNode,cardEntity); + getNodeTools.setEffectRangePreviewTest(cardEntity.cardOriginalData, euler, currentNode,cardEntity); //setEffectRangePreview(cardEntity.cardOriginalData.EffectRange, euler, currentNode); //influencePreviewPool.Add(currentNode); diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardEntity.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardEntity.cs index 05d1f04c..fc79c0e8 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardEntity.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardEntity.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text.RegularExpressions; using Unity.VisualScripting; @@ -131,7 +132,8 @@ public class CardEntity : MonoBehaviour //createCardDescription(); //createCardName(); //createCardCost(); - createCardImage(); + //createCardImage(); + createCardImageTest(); this.cardIndex = cardIndex; } @@ -190,6 +192,14 @@ public class CardEntity : MonoBehaviour } } + } + + public void createCardImageTest() + { + MapUnity currentNode = GameManager.Instance.ToolX[3].Y[3]; + getNodeTools.setCardImageTest(cardOriginalData, 90.0f, currentNode,this); + + } //获取卡牌名字 public void createCardName() @@ -197,6 +207,8 @@ public class CardEntity : MonoBehaviour cardName.text = cardOriginalData.ChineseName; } + + public void createCardCost() { /* if (cardOriginalData.FunctionVal.ContainsKey(CardFunction.xCost)) diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardOriginalDataList.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardOriginalDataList.cs index da7f9d48..e7b3261c 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardOriginalDataList.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardOriginalDataList.cs @@ -20,7 +20,7 @@ public class CardOriginalDataList : Singleton private void OnEnable() { - cardOriginalDataList = ReadExcel("card_data_3.csv"); + cardOriginalDataList = ReadExcel("card_data_4.csv"); //categorizeCardsByRarity(); existCardOriginalDataList = cardOriginalDataList; diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/GameManager.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/GameManager.cs index 1870f97a..52089dac 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/GameManager.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/GameManager.cs @@ -8,6 +8,7 @@ public class GameManager : Singleton { public bool complete; public List X; + public List ToolX; [Header("当前选择角色")] public SelectedCharacter character; public enum SelectedCharacter @@ -107,6 +108,7 @@ public class GameManager : Singleton { //生成空地图列表 GenerateEnmptyMapList(); + GenerateEnmptyMapListForTool(); // GenerateEnmptyMapListDefault(); //生成角色数据 if (PlayerStatsManager .Instance .playerState != null) @@ -146,6 +148,29 @@ public class GameManager : Singleton } } } + + public void GenerateEnmptyMapListForTool() + { + if (complete == false) + { + for (int i = 0; i < MapManager.Instance.line; i++) + { + int currentColum = 0; + if (i % 2 == 0) + { + currentColum = MapManager.Instance.column; + } + else + { + currentColum = MapManager.Instance.column - 1; + } + for (int j = 0; j < currentColum; j++) + { + ToolX[i].Y.Add(null); + } + } + } + } public void GenerateEnmptyMapListDefault() { if (complete == false) diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Handler/EffectRangeHandler3_1.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Handler/EffectRangeHandler3_1.cs index f33210f8..7acaebc8 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Handler/EffectRangeHandler3_1.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Handler/EffectRangeHandler3_1.cs @@ -69,4 +69,9 @@ public class EffectRangeHandler3_1 : EffectRangeHandlerBase } -} + private void get3_1Node(MapUnity currentNode, int offset, CardOriginalData cardOriginalData) + { + + } + + } diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Handler/EffectRangeHandlerBase.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Handler/EffectRangeHandlerBase.cs index 24da16de..750769a5 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Handler/EffectRangeHandlerBase.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Handler/EffectRangeHandlerBase.cs @@ -43,6 +43,27 @@ public class EffectRangeHandlerBase : EffectRangeHandler return canPass; } + public (int x, int y, int z) ooveInDirection(int x, int y, int z, float euler) + { + switch (euler) + { + case 30.0f: // 右上 + return (x + 1, y - 1, z); + case 90.0f: // 右 + return (x + 1, y, z - 1); + case 150.0f: // 右下 + return (x, y + 1, z - 1); + case 210.0f: // 左下 + return (x - 1, y + 1, z); + case 270.0f: // 左 + return (x - 1, y, z + 1); + case 330.0f: // 左上 + return (x, y - 1, z + 1); + default: + throw new ArgumentException("Invalid direction: must be between 0 and 5"); + } + } + public int getOffsetFromEuler(float euler) { int offset = 0; diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/MapManager.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/MapManager.cs index 34f1fcfd..bf0d4508 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/MapManager.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/MapManager.cs @@ -14,6 +14,10 @@ public class MapManager : Singleton public GameObject generatePoint; + public GameObject generatePointTest; + + public GameObject cameraObject; + public Vector3 lineOffSet; public Vector3 columnOffSet; @@ -175,7 +179,7 @@ public class MapManager : Singleton bookAnim.GetComponent().SetTrigger("move"); //书缝愈合 //bookUpAnim.SetActive(true); - + StartCoroutine(GenerateProcessTest()); enemyBurn(PlayerStatsManager.Instance.levelDevelopData.fightEenemyPool); } //总动画控制进程 @@ -195,6 +199,44 @@ public class MapManager : Singleton yield return StartCoroutine(CompleteGenerate()); } + IEnumerator GenerateProcessTest() + { + yield return StartCoroutine(MapGenerateTest()); + // yield return StartCoroutine(MapGenerateDefault()); + yield return StartCoroutine(SetUpMapUnityForTool()); + //yield return StartCoroutine(UPMoveMapUnity()); + //yield return new WaitForSeconds(2); + //yield return StartCoroutine(EnemyGenerate()); + //yield return StartCoroutine(CompleteGenerate()); + createCameraAboveObject(GameManager.Instance.ToolX[3].Y[3].gameObject, 10.0f, 0); + } + + public void createCameraAboveObject(GameObject targetObject, float heightAbove, float lookDownAngle) + { + // 1. 创建摄像机 + cameraObject = new GameObject("RenderCamera"); + Camera renderCamera = cameraObject.AddComponent(); + + // 设置摄像机参数 + renderCamera.clearFlags = CameraClearFlags.SolidColor; // 清除背景颜色 + renderCamera.backgroundColor = Color.clear; // 背景透明 + renderCamera.orthographic = true; // 正交投影 + renderCamera.orthographicSize = 5; + renderCamera.enabled = false; + // RenderTexture renderTexture = new RenderTexture(512, 512, 24); + //renderCamera.targetTexture = renderTexture; + + // 2. 设置摄像机位置:目标物体上方 + Vector3 targetPosition = targetObject.transform.position; + cameraObject.transform.position = targetPosition + new Vector3(0, heightAbove, 0); + + // 3. 设置摄像机朝向:向下看目标物体 + cameraObject.transform.LookAt(targetPosition); + + // 4. 调整倾斜角度(可选) + cameraObject.transform.Rotate(lookDownAngle, 0, 0); + } + //完成场地创建 IEnumerator CompleteGenerate() { @@ -232,6 +274,19 @@ public class MapManager : Singleton } yield return null; } + + IEnumerator SetUpMapUnityForTool() + { + // yield return StartCoroutine(MapGenerate()); + for (int i = 0; i < GameManager.Instance.ToolX.Count; i++) + { + for (int j = 0; j < GameManager.Instance.ToolX[i].Y.Count; j++) + { + GameManager.Instance.ToolX[i].Y[j].StartRegiste(); + } + } + yield return null; + } IEnumerator MapGenerate() { for (int i = 0; i < line; i++) @@ -301,6 +356,77 @@ public class MapManager : Singleton }*/ #endregion } + + IEnumerator MapGenerateTest() + { + for (int i = 0; i < line; i++) + { + if (i != 0) + { + generatePointTest.transform.position += columnOffSet; + } + generatePointTest.transform.position = new Vector3(20, 20, generatePointTest.transform.position.z); + + int currentColumn = column; + if (i != 0 && i % 2 != 0) + { + currentColumn = column - 1; + } + + for (int j = 0; j < currentColumn; j++) + { + if (i % 2 != 0 && j == 0) + { + generatePointTest.transform.position += lineOffSet / 2f; + } + + var a = Instantiate(mapUnity, generatePointTest.transform.position - new Vector3(0, 2, 0), mapUnity.transform.rotation); + MapUnity currentMapUnityScript = a.GetComponent(); + + currentMapUnityScript.locationX = i; + currentMapUnityScript.locationY = j; + currentMapUnityScript.RegisterUnitForTool(); + generatePointTest.transform.position += lineOffSet; + } + } + yield return null; + #region 隐藏多余节点 + /* //隐藏多余节点 + List X = GameManager.Instance.X; + for (int i = 0; i < (int)(line / 2f); i++) + { + + if (i == 0) + { + X[i].Y[0].gameObject.SetActive(false); + X[i].Y[1].gameObject.SetActive(false); + X[i].Y[X[i].Y .Count -1].gameObject.SetActive(false); + X[i].Y[X[i].Y.Count - 2].gameObject.SetActive(false); + } + else + { + X[i].Y[0].gameObject.SetActive(false); + X[i].Y[X[i].Y.Count - 1].gameObject.SetActive(false); + } + } + for (int i = (int)(line / 2f)+1; i < line ; i++) + { + + if (i == line -1) + { + X[i].Y[0].gameObject.SetActive(false); + X[i].Y[1].gameObject.SetActive(false); + X[i].Y[X[i].Y.Count - 1].gameObject.SetActive(false); + X[i].Y[X[i].Y.Count - 2].gameObject.SetActive(false); + } + else + { + X[i].Y[0].gameObject.SetActive(false); + X[i].Y[X[i].Y.Count - 1].gameObject.SetActive(false); + } + }*/ + #endregion + } IEnumerator MapGenerateDefault() { for (int i = 0; i < line; i++) diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/MapUnity.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/MapUnity.cs index be042319..63e0c905 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/MapUnity.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/MapUnity.cs @@ -7,9 +7,13 @@ using UnityEngine.UI; public class MapUnity : MonoBehaviour { public List unitPool;//临接对象池 - public int locationX;//六边形坐标 + public int locationX; public int locationY; + public int cubeQ;//六边形坐标(立方) + public int cubeS; + public int cubeR; + public bool compalte;//标识已完成 [Header("UI效果范围控件")] @@ -86,6 +90,11 @@ public class MapUnity : MonoBehaviour int xStart = locationX * 2 + 1; int yStart = locationY * 2 + 1; + //计算立方坐标 + (int q, int s, int r) = MathTool.AxialToCube(locationY, locationX); + cubeQ = q; + cubeS = s; cubeR = r; + //拼接地图 if (locationX !=0&&locationX % 2 != 0) { @@ -163,13 +172,22 @@ public class MapUnity : MonoBehaviour public void switchColor(int newColor) { - whoColour = newColor; + if (newColor != 10) + { + whoColour = newColor; + } RefreshWhoColor(); } public void RegisterUnit() { GameManager.Instance.X[locationX].Y[locationY] = this; } + + public void RegisterUnitForTool() + { + Debug.Log(GameManager.Instance.ToolX[0].Y.Count); + GameManager.Instance.ToolX[locationX].Y[locationY] = this; + } public void ConnectUnit() { diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Player.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Player.cs index 70c381a3..9bd4b4d8 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Player.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Player.cs @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Collections.Generic; using UnityEngine; @@ -97,25 +98,32 @@ public class Player : MonoBehaviour TurnMaster.Instance.playerAction = TurnMaster.PlayerAction.none; } - - switch (GameManager.Instance.playerOn.whoColour) + try { - case Name .NodeColor .Red : - standOnBuff.sprite = onRed; - break; - case Name.NodeColor.Green: - standOnBuff.sprite = onGreen; - break; - case Name.NodeColor.Blue: - standOnBuff.sprite = onBule; - break; - case Name.NodeColor.Black: - standOnBuff.sprite = onBlack; - break; - case Name.NodeColor.White: - standOnBuff.sprite = defaultBuff; - break; + switch (GameManager.Instance.playerOn.whoColour) + { + case Name.NodeColor.Red: + standOnBuff.sprite = onRed; + break; + case Name.NodeColor.Green: + standOnBuff.sprite = onGreen; + break; + case Name.NodeColor.Blue: + standOnBuff.sprite = onBule; + break; + case Name.NodeColor.Black: + standOnBuff.sprite = onBlack; + break; + case Name.NodeColor.White: + standOnBuff.sprite = defaultBuff; + break; + } } + catch(Exception e) + { + + } + } diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/MainMnue.meta b/ColorlessWorld-2024-4-2/Assets/Scripts/Servent/MainMnue.meta similarity index 100% rename from ColorlessWorld-2024-4-2/Assets/Scripts/MainMnue.meta rename to ColorlessWorld-2024-4-2/Assets/Scripts/Servent/MainMnue.meta diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/MainMnue/MineMnueSlied.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Servent/MainMnue/MineMnueSlied.cs similarity index 100% rename from ColorlessWorld-2024-4-2/Assets/Scripts/MainMnue/MineMnueSlied.cs rename to ColorlessWorld-2024-4-2/Assets/Scripts/Servent/MainMnue/MineMnueSlied.cs diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/MainMnue/MineMnueSlied.cs.meta b/ColorlessWorld-2024-4-2/Assets/Scripts/Servent/MainMnue/MineMnueSlied.cs.meta similarity index 100% rename from ColorlessWorld-2024-4-2/Assets/Scripts/MainMnue/MineMnueSlied.cs.meta rename to ColorlessWorld-2024-4-2/Assets/Scripts/Servent/MainMnue/MineMnueSlied.cs.meta diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/MathTool.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/MathTool.cs index 7bacad0f..a95d47ab 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/MathTool.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/MathTool.cs @@ -41,7 +41,83 @@ public class MathTool return numbers; } + public static List<(int x, int y, int z)> RotateCoordinates(List<(int x, int y, int z)> coordinates, int angle) + { + List<(int x, int y, int z)> rotatedCoordinates = new List<(int x, int y, int z)>(); + + foreach (var coord in coordinates) + { + (int x, int y, int z) rotatedCoord = coord; + + // 将角度标准化到 0 - 360 之间,并判断旋转多少次 60 度 + //int rotationSteps = (angle % 360) / 60; + + int rotationSteps=0; + if (angle >= 350 || angle < 40) rotationSteps= 5; + if (angle >= 70 && angle < 110) rotationSteps = 0; + if (angle >= 130 && angle < 170) rotationSteps = 1; + if (angle >= 190 && angle < 230) rotationSteps = 2; + if (angle >= 250 && angle < 290) rotationSteps = 3; + if (angle >= 310 && angle < 350) rotationSteps = 4; + + + // 根据旋转的次数进行坐标变换 + for (int i = 0; i < rotationSteps; i++) + { + rotatedCoord = Rotate60DegreesClockwise(rotatedCoord); + } + + rotatedCoordinates.Add(rotatedCoord); + } + + return rotatedCoordinates; + } + + // 函数用于将坐标顺时针旋转 60 度 + private static (int x, int y, int z) Rotate60DegreesClockwise((int x, int y, int z) coord) + { + int x = coord.x; + int y = coord.y; + int z = coord.z; + // 60 度顺时针旋转公式 + return (-z, -x, -y); + } + + public static (int x, int y) CubeToAxial(int q, int s, int r) + { + + int y = -r; + int x = q - (y + 1) / 2; + return (x, y); + } + + // 从轴向坐标转换为立方坐标 + public static (int q, int s, int r) AxialToCube(int x, int y) + { + + int q = (y+1)/2+x; + int r = -y; + int s = -q - r; + return (q, s, r); + } + + public static List<(int x, int y, int z)> TranslateHexesToNewOrigin(List<(int x, int y, int z)> hexList, (int x, int y, int z) newOrigin) + { + List<(int x, int y, int z)> translatedHexes = new List<(int x, int y, int z)>(); + + foreach (var hex in hexList) + { + int newX = hex.x + newOrigin.x; + int newY = hex.y + newOrigin.y; + int newZ = hex.z + newOrigin.z; + + // Ensure x + y + z = 0 for consistency in cube coordinates + translatedHexes.Add((newX, newY, newZ)); + } + + return translatedHexes; + } public static void keepNature(int number) { diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/Name.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/Name.cs index 58100da6..02faa73f 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/Name.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/Name.cs @@ -99,7 +99,7 @@ public static class Name public static int stringColorToint(string color) { - int intcolor = 1; + int intcolor = 10; switch (color) { case Color.Red: diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/getNodeTools.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/getNodeTools.cs index be7dfd34..ac34795f 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/getNodeTools.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/getNodeTools.cs @@ -1,8 +1,12 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using Unity.VisualScripting; using UnityEngine; +using UnityEngine.UIElements; +using static UnityEditor.Experimental.AssetDatabaseExperimental.AssetDatabaseCounters; +using static UnityEditor.FilePathAttribute; public class getNodeTools { @@ -107,6 +111,21 @@ public class getNodeTools } } + public static MapUnity getNodeWithCube(int q, int s,int r) + { + //计算立方坐标 + (int x, int y) = MathTool.CubeToAxial(q,s,r); + MapUnity result = GameManager.Instance.X[y].Y[x]; + return result; + } + + public static MapUnity getToolNodeWithCube(int q, int s, int r) + { + //计算立方坐标 + (int x, int y) = MathTool.CubeToAxial(q, s, r); + MapUnity result = GameManager.Instance.ToolX[y].Y[x]; + return result; + } public static HashSet getAllNodes() { HashSet set = new HashSet(); @@ -618,6 +637,86 @@ public class getNodeTools }*/ } + public static void setEffectRangePreviewTest(CardOriginalData cardOriginalData, float euler, MapUnity currentNode, CardEntity cardEntity) + { + List<(int, int, int)> cubeList = new List<(int, int, int)>(); + int intEuler=(int)euler; + //Debug.Log("euler是" + intEuler); + for (int i = 0; i < cardOriginalData.nodesMark.Length; i++) + { + + try + { + string[] marks = cardOriginalData.nodesMark[i].Split("_"); + (int q, int s, int y) = MathTool.AxialToCube(int.Parse(marks[0]) , int.Parse(marks[1])); + cubeList.Add((q, s, y)); + } + catch (Exception e) + { } + } + List<(int, int, int)> rotatedCubeList = new List<(int, int, int)>(); + rotatedCubeList = MathTool.RotateCoordinates(cubeList, intEuler); + List<(int, int, int)> trueCubeList = new List<(int, int, int)>(); + trueCubeList = MathTool.TranslateHexesToNewOrigin(rotatedCubeList, (currentNode.cubeQ, currentNode.cubeS, currentNode.cubeR)); + foreach (var tuple in trueCubeList) + { + MapUnity endNode = new MapUnity(); + endNode = getNodeWithCube(tuple.Item1, tuple.Item2, tuple.Item3); + if (endNode != null) + { + cardEntity.influencePreviewPool.Add(endNode); + } + } + + } + + public static void setCardImageTest(CardOriginalData cardOriginalData, float euler, MapUnity currentNode,CardEntity cardEntity) + { + List<(int, int, int)> cubeList = new List<(int, int, int)>(); + int intEuler = (int)euler; + Debug.Log("euler是" + intEuler); + for (int i = 0; i < cardOriginalData.nodesMark.Length; i++) + { + + try + { + string[] marks = cardOriginalData.nodesMark[i].Split("_"); + (int q, int s, int y) = MathTool.AxialToCube(int.Parse(marks[0]), int.Parse(marks[1])); + cubeList.Add((q, s, y)); + } + catch (Exception e) + { } + } + List<(int, int, int)> rotatedCubeList = new List<(int, int, int)>(); + rotatedCubeList = MathTool.RotateCoordinates(cubeList, intEuler); + List<(int, int, int)> trueCubeList = new List<(int, int, int)>(); + trueCubeList = MathTool.TranslateHexesToNewOrigin(rotatedCubeList, (currentNode.cubeQ, currentNode.cubeS, currentNode.cubeR)); + for (int i = 0; i < trueCubeList.Count; i++) + { + MapUnity endNode = new MapUnity(); + endNode = getToolNodeWithCube(trueCubeList[i].Item1, trueCubeList[i].Item2, trueCubeList[i].Item3); + if (endNode != null) + { + Debug.Log("染色成功"+ cardOriginalData.nodesColor[i]); + endNode.switchColor(Name.stringColorToint(cardOriginalData.nodesColor[i])); + //endNode.influenced = true; + } + } + RenderTexture renderTexture = new RenderTexture(512, 512, 24); + Camera renderCamera = MapManager.Instance.cameraObject.GetComponent(); + renderCamera.targetTexture = renderTexture; + Texture2D texture = new Texture2D(renderTexture.width, renderTexture.height, TextureFormat.ARGB32, false); + RenderTexture.active = renderCamera.targetTexture; + renderCamera.Render(); + texture.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0); + texture.Apply(); + RenderTexture.active = null; + Material material = new Material(Shader.Find("Standard")); + material.mainTexture = renderTexture; + cardEntity.cardImage.sprite= Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f)); + + } + public static HashSet setEffectRangePreviewNoCard(string effectRange, float euler, MapUnity currentNode) { MapUnity playerOnNode = GameManager.Instance.playerOn.transform.GetComponent(); diff --git a/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4.csv b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4.csv new file mode 100644 index 00000000..49c17d37 --- /dev/null +++ b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4.csv @@ -0,0 +1,2 @@ +锘縄D,璐圭敤,鏂芥硶鑼冨洿,浣滅敤鑼冨洿,鏉′欢,鍔熻兘,鏁板,鍦板潡鏍囪,鍦板潡棰滆壊,鍥剧墖璺緞 +1001,1,2,3_1,red>8;blue<20,1;2,5;4,0_0;1_0;2_0,red;red;red,CardIcon/1010 diff --git a/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4.csv.meta b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4.csv.meta new file mode 100644 index 00000000..1e014b06 --- /dev/null +++ b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4.csv.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 741f3a676aaf67e458b1f5f2dfb9dea0 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ColorlessWorld-2024-4-2/Assets/data/card_data_4.csv b/ColorlessWorld-2024-4-2/Assets/data/card_data_4.csv new file mode 100644 index 00000000..e54225b1 --- /dev/null +++ b/ColorlessWorld-2024-4-2/Assets/data/card_data_4.csv @@ -0,0 +1,16 @@ +锘縄D,鍚嶇О,璐圭敤,绋鏈夊害,鏂芥硶鑼冨洿,浣滅敤鑼冨洿,娑堣,鏉′欢,鍔熻兘,鏁板,鍦板潡鏍囪,鍦板潡棰滆壊,鍥剧墖璺緞 +1001,鏄熼棯,1,1,3,1,0,none,1,5,,green,CardIcon/1 +1002,寰厜,1,1,1,2,0,none,2,5,0,red;red,CardIcon/2 +1003,鍏夎緣鏉栧嚮,2,2,1,4_1,0,none;red>3_green>1,1;5_1,9;2_5,0;0_0;0_0_0,red;red;red;red,CardIcon/4_1 +1004,鏄熻緣鎶ょ浘,2,2,2,3_2,0,none;red>5,2;2,8;1,2;-2,red;red;red,CardIcon/3_2 +1101,,1,2,1,5_4,0,red>4;red>6,1;25,8;3,0;0_-1;0_1;0_0,red;red;red;red;red,CardIcon/Sslx_Card_Kamizn_Feibiao_v01 +1102,,1,1,2,5_5,0,red>3,2,7,1;-1;1_0;-1_0,red;red;red;red;red,CardIcon/Sslx_Card_Kamizn_Feibiao_v01 +1103,,1,1,1,4_1,0,red>1,1,10,0;0_0;0_0_0,red;red;red;red,CardIcon/Sslx_Card_Kamizn_Feibiao_v01 +1104,,1,1,3,3_4,0,red>2,25,8,0;-1,red;red;red,CardIcon/Sslx_Card_Kamizn_Feibiao_v01 +1105,,2,2,2,6_5,0,red>2;red>10,1;5,12;2,0;-1;0_-1;-1_-1;0_0,red;red;red;red;red;red;red,CardIcon/Sslx_Card_Kamizn_Feibiao_v01 +1106,,1,1,1,4_1,0,red>3_green>2,1,8,0;0_0;0_0_0,red;red;green;green,CardIcon/Sslx_Card_Kamizn_Feibiao_v01 +1107,,2,2,2,6_7,0,red>7;blue<4,25;4,6;4,0;-1;1;0_0;0_0_0,red;red;red;red;green;green,CardIcon/Sslx_Card_Kamizn_Feibiao_v01 +1108,,2,2,2,6_4,0,red>7;green>4,1;4,12;6,0;-1;1;0_1;0_-1,red;red;red;red;green;green,CardIcon/Sslx_Card_Kamizn_Feibiao_v01 +1109,,2,2,2,7_3,0,red<15;blue<6,1_25;19,7_8;2,0;-1;1;-2;2;0_0,green;green;red;red;red;red;green,CardIcon/Sslx_Card_Kamizn_Feibiao_v01 +1110,,1,1,2,3_4,0,red>3,1,6,0;-1,red;red;blue,CardIcon/Sslx_Card_Kamizn_Feibiao_v01 +1111,,2,2,0,6_3,0,red>6;blue>2,1;48,6;5,0;1;-1;-2;2;3,None;blue;blue;blue;red;red;red,CardIcon/Sslx_Card_Kamizn_Feibiao_v01 diff --git a/ColorlessWorld-2024-4-2/Assets/data/card_data_4.csv.meta b/ColorlessWorld-2024-4-2/Assets/data/card_data_4.csv.meta new file mode 100644 index 00000000..61be35c4 --- /dev/null +++ b/ColorlessWorld-2024-4-2/Assets/data/card_data_4.csv.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 45d411a9f662d64478953b229cfd1a00 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ColorlessWorld-2024-4-2/obj/Debug/Assembly-CSharp-Editor.csproj.AssemblyReference.cache b/ColorlessWorld-2024-4-2/obj/Debug/Assembly-CSharp-Editor.csproj.AssemblyReference.cache index 6ff4879b0ed4a029b62e6ec53f048e161c4445ed..7c04975099150bcc24f7ace9fd20a8a21921b842 100644 GIT binary patch literal 137297 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 EA0hr#+W-In literal 138820 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