using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; namespace Entity { public class Outline : MonoBehaviour { public GameObject body; public SpriteRenderer outlineRenderer; public CapsuleCollider2D outlineCollider; public Entity entity; private bool _select = false; public void Init() { var size = GetSize(); outlineRenderer.size = size; outlineCollider.direction = size.x > size.y ? CapsuleDirection2D.Horizontal : CapsuleDirection2D.Vertical; outlineCollider.size = size; } public void Show() { outlineRenderer.enabled = true; } public void Hide() { outlineRenderer.enabled = false; } /// /// 获取指定对象及其所有子对象组成的图像的大小。 /// /// /// 返回一个 Vector3 对象,表示对象在世界空间中的总大小(宽度、高度、深度)。 /// 如果没有找到任何渲染器,则返回 (-1, -1, -1) 表示无效大小。 /// public Vector3 GetSize() { var renderers = body.GetComponentsInChildren(); if (renderers.Length == 0) { return new(-1, -1); } var totalBounds = renderers[0].bounds; for (var i = 1; i < renderers.Length; i++) { totalBounds.Encapsulate(renderers[i].bounds); } var size = totalBounds.size; return size; } private void OnMouseEnter() { Show(); _select = true; } private void OnMouseExit() { Hide(); _select = false; } private void OnMouseOver() { // 检测是否按下的是鼠标右键 if (Input.GetMouseButtonDown(1)) // 鼠标右键对应的是按钮索引 1 { var rightMenu = Prefab.RightMenuPrefab.Instance; rightMenu.Init(GetMenu()); rightMenu.transform.position=Input.mousePosition; rightMenu.Show(); } } private List<(string name, UnityAction callback)> GetMenu() { var result = new List<(string name, UnityAction callback)>(); if(entity.PlayerControlled) result.Add(("结束操控",()=>entity.PlayerControlled=false)); else result.Add(("手动操控",()=>entity.PlayerControlled=true)); result.Add(("杀死",()=>entity.Kill())); return result; } } }