Unity3D_(外掛)小地圖自刷新制作Minimap小地圖
製作小地圖:小地圖自刷新制作小地圖
原理:由場景中的物體控制圖示型別在小地圖上的建立,並控制圖示的位置更新
好處:可更好控制小地圖上所需要顯示的遊戲物體
遊戲專案已託管到Github上: 傳送門
使用Camera渲染製作Minimap小地圖: 傳送門
小地圖效果
(不足:並未對超出地圖中的物體進行銷燬~)
指令碼
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Minimap : MonoBehaviour {Minimap.cs//單例模式 public static Minimap _instance; public GameObject iconPrefab; void Awake() { _instance = this; } public GameObject AddIcon(string iconname) { GameObject go = NGUITools.AddChild(this.gameObject,iconPrefab); //設定圖示的名字,更新圖示的顯示 go.GetComponent<UISprite>().spriteName=iconname;//把創建出來的圖示返回出來 return go; } }
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MinimapItem : MonoBehaviour { public string iconName; private GameObject minimapIconGo; private Transform iconTrans; private Transform player;MinimapItem.csvoid Start() { player = GameObject.FindGameObjectWithTag("Player").transform; minimapIconGo = Minimap._instance.AddIcon(iconName); iconTrans = minimapIconGo.transform; } private void FixedUpdate() { Vector3 offset = transform.position - player.position; iconTrans.localPosition = new Vector3(offset.x, offset.z, 0)*5; } void OnDestroy() { Destroy(this.minimapIconGo); } }
預製場景
建立一個場景Gary_map
調整場景燈光亮度Intensity為0.3
新增一個Plane地面,給地面新增材質模擬地圖場景
新增一個Capsule物體作為玩家Player,為Player繫結PlayerMove指令碼控制其移動
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMove : MonoBehaviour { public float speed = 4; // Use this for initialization void Start () { } // Update is called once per frame void Update () { float h = Input.GetAxis("Horizontal"); float v = Input.GetAxis("Vertical"); transform.Translate(new Vector3(h,0,v)*speed*Time.deltaTime); } }PlayerMove.cs
新增幾個Capsule物體作為敵人Enemy,給Enemy新增指令碼使其隨機移動
新增材質給Player,區別於敵人
新增Ground標籤給地面,Human標籤給玩家和敵人(目的:只用來作為攝像機Culling Mask渲染層級,不做玩家和敵人區分)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyMove : MonoBehaviour { public float speed =4; private float timer = 0; private float dirx = 0; private float dirz = 0; // Update is called once per frame void Update () { timer += Time.deltaTime; if (timer > 4) { dirx = Random.Range(-1f, 1f); dirz = Random.Range(-1f, 1f); timer = 0; } transform.Translate(new Vector3(dirx, 0, dirz) * speed * Time.deltaTime); } }EnemyMove.cs
實現過程
為了讓圖示顯示在小地圖上,先使用NGUI將要顯示在地圖上的圖示製作成圖集(Atlas Maker)
新增一個UI Root,Delete掉背景,在Scene場景中新增一個Sprite用來顯示小地圖圖示,將Sprite放置在UI Root右上角
將UI Sprite下的Atlas圖集選擇Wooden Atlas,Sprite選擇Highlight-Shadowed圖集
將其型別設定為Sliced(可剪下的),透明度可適當調低(opacity:100),位置Anchors設定為右上角
將其重新命名為minimap-bg
UI Root下建立一個Container容器,作為minimap的整體,位置設定為右上角
UI Root下建立一個Sprite圖片,用來表示玩家icon,將其重新命名為player-icon
將player-icon和minimap-bg放置在minimap父物體下
將player-icon製作為預製體minimap-ngui-icon
在minimap上新增Minimap指令碼,通過Minimap指令碼獲得場景中游戲物體的圖示的名字,實時更新圖示的顯示
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Minimap : MonoBehaviour { //單例模式 public static Minimap _instance; public GameObject iconPrefab; void Awake() { _instance = this; } public GameObject AddIcon(string iconname) { GameObject go = NGUITools.AddChild(this.gameObject,iconPrefab); //設定圖示的名字,更新圖示的顯示 go.GetComponent<UISprite>().spriteName=iconname; //把創建出來的圖示返回出來 return go; } }Minimap.cs
給player新增Player標籤,新增Minimap Item指令碼
Minimap Item指令碼上引用Icon Name表示物體在小地圖上所顯示的圖示
給Player和Enemy1、2、3、4、5繫結Minimap Item指令碼
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MinimapItem : MonoBehaviour { public string iconName; private GameObject minimapIconGo; private Transform iconTrans; private Transform player; void Start() { player = GameObject.FindGameObjectWithTag("Player").transform; minimapIconGo = Minimap._instance.AddIcon(iconName); iconTrans = minimapIconGo.transform; } private void FixedUpdate() { Vector3 offset = transform.position - player.position; iconTrans.localPosition = new Vector3(offset.x, offset.z, 0)*5; } void OnDestroy() { Destroy(this.minimapIconGo); } }MinimapItem.cs
小地圖上就能實時顯示遊戲場景中Icon的位置了
小地圖與場景中比例控制 1:5
private void FixedUpdate() { Vector3 offset = transform.position - player.position; iconTrans.localPosition = new Vector3(offset.x, offset.z, 0)*5; }