• RPG游戏-小地图系统(二)


    这里对上次的代码做优化,当进入或者地图时,小地图UI也应该进行变化。

    调用次序:MapController—>MiniMapManager -->UIminiMap

    1.MapController脚本

    首先是每个场景都需要有个MapRoot,MapRoot绑定MapController脚本,且该节点需要有该地图的一个MiniMapBoundingBox(见上一篇文章) 在进入地图时调用单例的MiniMapManager
    在这里插入图片描述

    public class MapController : MonoBehaviour
    {
        public Collider minimapBoundingBox;
        // Start is called before the first frame update
        void Start()
        {
            MiniMapManager.Instance.UpdateMinimap(minimapBoundingBox);
        }
    
        // Update is called once per frame
        void Update()
        {
            
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2.MiniMapManager脚本

    using Models;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using UnityEngine;
    
    namespace Managers
    {
    
        class MiniMapManager : Singleton<MiniMapManager>
        {
            private Collider minimapBoundingBox;
            public UIMiniMap miniMap;
            public Collider MinimapBoundingBox
            {
                get { return minimapBoundingBox; }
            }
            public Transform PlayerTransform
            {
                get
                {
                    if (User.Instance.CurrentCharacterObj == null) return null;
                    return User.Instance.CurrentCharacterObj.transform;
                }
            }
            public Sprite LoadCurrentMiniMap()
            {
                return Resources.Load<Sprite>("UI/MiniMap/" + User.Instance.CurrentMapData.MiniMap);
            }
            public void UpdateMinimap(Collider minimapBoundingBox)
            {
                this.minimapBoundingBox = minimapBoundingBox;
                if (this.miniMap != null)
                {
                    this.miniMap.UpdateMap();
                }
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    3.UIMiniMap脚本

    using Models;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using Managers;
    
    public class UIMiniMap : MonoBehaviour
    {
        public Image minimap;
        public Image arrow;//角色箭头
        public Text MapName;
        private Transform playerTransform;
        public Collider MinimapBoundingBox;
        void Start()
        {
            MiniMapManager.Instance.miniMap = this;
            this.UpdateMap();
        }
        public void UpdateMap()
        {
            this.MapName.text = User.Instance.CurrentMapData.Name;
            this.minimap.overrideSprite = MiniMapManager.Instance.LoadCurrentMiniMap();
            this.minimap.SetNativeSize();
            this.minimap.transform.localPosition = Vector3.zero;
            this.MinimapBoundingBox = MiniMapManager.Instance.MinimapBoundingBox;
            this.playerTransform = null;//进入新地图玩家的实例不是上个图的,因此需要清理掉 在update重新获取
    
        }
        // Update is called once per frame
        void Update()//坐标转换:世界坐标->小地图坐标
        {
            this.UpdateMap();
            if (playerTransform == null)
            {
                this.playerTransform = MiniMapManager.Instance.PlayerTransform;//获取角色对象实例
            }
            if (MinimapBoundingBox == null || playerTransform == null) return;
            float realWidth = this.MinimapBoundingBox.bounds.size.x;
            float realHeight = this.MinimapBoundingBox.bounds.size.z;
            float relaX = playerTransform.position.x - MinimapBoundingBox.bounds.min.x;//MinimapBoundingBox.bounds.min.x->碰撞体左下角的X坐标
            float relaY = playerTransform.position.z - MinimapBoundingBox.bounds.min.z;
    
            float pivotX = relaX / realWidth;
            float pivotY = relaY / realHeight;
            //获取玩家在小地图的中心点位置
            this.minimap.rectTransform.pivot = new Vector2(pivotX, pivotY);
            this.minimap.rectTransform.localPosition = Vector2.zero;//相对于父物体pivot的子物体pivot位置
            this.arrow.transform.eulerAngles = new Vector3(0, 0, -this.playerTransform.eulerAngles.y);
            //小地图是2D坐标 标准XYZ 角色是3D坐标 绕Y旋转
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
  • 相关阅读:
    最佳实践:路径路由匹配规则的设计与实现
    基于SSM+Vue的订餐系统设计与实现
    pgsql_全文检索_使用空间换时间的方法支持中文搜索
    g++安装 yum -y install gcc+ gcc-c++ 报错Unable to find a match: gcc+
    【初学者】Vue使用axios向Node.js发起请求以及跨域问题的解决
    制作ubuntu18.04系统盘
    WebSocket消息推送
    【视觉SLAM入门】7.3.后端优化 基于KF/EKF和基于BA图优化的后端,推导及举例分析
    如何在银行系统中做批量测试~
    原生JavaScript实现本地存储(localStorage)和会话存储(sessionStorage)
  • 原文地址:https://blog.csdn.net/qq_43008645/article/details/126924755