using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class CharacterManager : MonoBehaviour { // ========= SerializeField ============= [SerializeField] private List friendPrefabs; [SerializeField] private List enemyPrefabs; [SerializeField] private Transform characterContainer; [SerializeField] private Transform enemyContainer; [SerializeField] private Camera mainCamera; [SerializeField] private bool showDebugObject = false; // ========== Public ============== private readonly List enemyPositionList = new List(); private readonly List characterPositionList = new List(); private readonly List renderCharacterList = new List(); private readonly List renderEnemyList = new List(); // ========== Private ================ private GameObject debug_object; private void Start() { if (mainCamera == null) mainCamera = Camera.main; // debug_object = Instantiate(friendPrefabs[0], // Vector3.zero + characterContainer.position, Quaternion.identity, characterContainer); // debug_object.name = "DebugObject"; // debug_object.SetActive(showDebugObject); // math_world_position_point(); // render_character_sprite(true); // render_character_sprite(false); } public void RenderCharacterSprite() { for (var i = 0; i < friendPrefabs.Count; i++) { STRUCT_TURN_CHARACTER.CHARACTER_RENDER_DATA characterRenderData; characterRenderData.IS_ENEMY = false; characterRenderData.RENDER_POSITION = characterPositionList[i]; characterRenderData.RENDER_PREFAB = friendPrefabs[i]; characterRenderData.NAME = "Character_" + i; characterRenderData.ROTATION = Quaternion.identity; Transform parent_transform = characterContainer; GameObject character = Instantiate( characterRenderData.RENDER_PREFAB, position: characterRenderData.RENDER_POSITION, rotation: Quaternion.identity, parent: parent_transform); character.name = characterRenderData.NAME; Character character_component = character.GetComponent(); character_component.SetCharacterRenderData(characterRenderData); renderCharacterList.Add(character_component); } } public void RenderEnemySprite() { for (var i = 0; i < enemyPrefabs.Count; i++) { STRUCT_TURN_CHARACTER.CHARACTER_RENDER_DATA characterRenderData; characterRenderData.IS_ENEMY = true; characterRenderData.RENDER_POSITION = enemyPositionList[i]; characterRenderData.RENDER_PREFAB = enemyPrefabs[i]; characterRenderData.NAME = "Enemy_" + i; characterRenderData.ROTATION = Quaternion.Euler(0, 180, 0); Transform parent_transform = enemyContainer; GameObject character = Instantiate( characterRenderData.RENDER_PREFAB, position: characterRenderData.RENDER_POSITION, rotation: Quaternion.identity, parent: parent_transform); character.name = characterRenderData.NAME; character.transform.GetChild(0).rotation = characterRenderData.ROTATION; Character character_component = character.GetComponent(); character_component.SetCharacterRenderData(characterRenderData); renderEnemyList.Add(character_component); } } public void MathWorldPositionPoint() { // 计算屏幕边界 float screen_half = Screen.width / 2f; float screen_offset_right = screen_half / 6f; // 屏幕右边的偏移 float screen_offset_left = screen_half / 8f; // 屏幕左边的偏移 float screen_in_fact_space = screen_half - screen_offset_right - screen_offset_left; // 屏幕内实际可用空间 float sprite_space = screen_in_fact_space / 3f; // 3张牌的实际可用空间 float _sprite_offset = (sprite_space * 0 + sprite_space * 1) / 2f; // 3张牌每张偏移 for (int i = 0; i < 3; i++) { float position_x = screen_offset_left + i * sprite_space + _sprite_offset; float position_x_enemy = screen_half + screen_offset_right + i * sprite_space + _sprite_offset; characterPositionList.Add(switch_screen_position_to_world_position(position_x)); enemyPositionList.Add(switch_screen_position_to_world_position(position_x_enemy)); } Vector3 switch_screen_position_to_world_position(float screen_position_x) { Vector3 world_position = mainCamera!.ScreenToWorldPoint( new Vector3(screen_position_x, Screen.height / 2f, 0)); world_position.y = world_position.y + characterContainer.transform.position.y; world_position.z = 0; return world_position; } } }