1. 程式人生 > >Unity3D_(外掛)小地圖自刷新制作Minimap小地圖

Unity3D_(外掛)小地圖自刷新制作Minimap小地圖

   製作小地圖:小地圖自刷新制作小地圖

   原理:由場景中的物體控制圖示型別在小地圖上的建立,並控制圖示的位置更新

   好處:可更好控制小地圖上所需要顯示的遊戲物體

  遊戲專案已託管到Github上:  傳送門

  使用Camera渲染製作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
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

預製場景

  建立一個場景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;
    }