当前位置:   article > 正文

Unity小地图制作_unity3d中两种绘制小地图的方法

unity3d中两种绘制小地图的方法

Unity小地图制作

方法一(简易版,如果角色有跳跃功能不建议使用)

原理:利用一个新的摄像机来制作小地图
步骤
(1)先搭建一个简单场景
在这里插入图片描述
(2)在层级列表先创建一个摄像机,移出其中的Audio Listener组件(一个场景中只能有一个Audio Listener组件),用作小地图的摄像机。
在这里插入图片描述
(3)在下面的Assets中创建一个“渲染纹理(Render Texture)”
在这里插入图片描述
(4)点击刚创建的相机,将Render Texture拖到相机中的目标纹理中。
在这里插入图片描述
(5)将场景调整到垂直正上方视角,(或调整到想让小地图展示的视角)如下图
在这里插入图片描述
(6)点击新创建的相机,然后按下Ctrl+Shift+F键,此时右下角的新建摄像机视图就是你想找事小地图的视角。同时,目标纹理也变成了该视角。
在这里插入图片描述
(7)在层级面板创建一个Canvas【层级面板右键,UI,面板(Canvas)】,并在Canvas下方创建一个原始图像(Raw Image)
在这里插入图片描述
(8)将之前创建的Render Texture拖到Raw Image的纹理中。
在这里插入图片描述
(6)双击Canvas,点击上方的2D,现在开始调整小地图的位置和大小。
在这里插入图片描述
(7)最后效果
在这里插入图片描述
方法二
(1)先准备三个Texture,作为敌人和玩家的图标和背景。
在这里插入图片描述
(2)搭建一个简单场景,蓝色为玩家,创建玩家时将标签设置为“Player”,红色为敌人,创建敌人时将标签设置为“Enemy”
在这里插入图片描述
在这里插入图片描述
(3)创建一个Canvas,在Canvas下方创建一个Image,命名为“ShowLittleMap”
在这里插入图片描述
(4)双击Canvas,点击上方的2D,将刚创建的ShowLittleMap拖到右上角(小地图现实的方位)调整其位置和大小。
在这里插入图片描述
(5)点击导入的三张Texture,将它们的纹理类型改为Sprite
在这里插入图片描述
(6)点击Cnavas下的ShowLittleMap,将其纹理设置为导入的Background,这样小地图背景完成。
在这里插入图片描述
(7)创建一个图片预制体
在ShowLittleMap下方创建一个Image,拖入一张图片,设置图片大小为小地图显示图标大小。
在这里插入图片描述
在Assets中创建一个文件夹,命名文"Resources",如果有就不用创建了。
将层级面板的Image拖到这个文件夹中,制成预制体(一定要放在该文件夹,因为后面面要动态加载)
然后将层级面板中Image删除。
在这里插入图片描述
然后在Resources文件夹下创建一个新文件夹命名为Texture,将Player和Enemy图标放到里面
在这里插入图片描述
(8)创建一个脚本,命名为“LittleMap”,用于小地图的显示,将该脚本挂载到ShowLittleMap上。
代码:(动态显示玩家位置,仅显示旋转,不显示移动)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class LittleMap : MonoBehaviour
{
    private RectTransform rect;//

    private Transform player;

    private static Image item;//图片预制体

    private Image playerImage;//玩家图片
    // Start is called before the first frame update
    void Start()
    {
        rect = GetComponent<RectTransform>();//获取ShowLittleMap位置
        player = GameObject.FindWithTag("Player").transform;//获取玩家位置
        item = Resources.Load<Image>("Image");//动态加载Image类型

        if (player != null)
        {
            playerImage=Instantiate(item);//实例
        }

    }

    // Update is called once per frame
    void Update()
    {
        ShowPlayerImage();
    }


    private void ShowPlayerImage()
    {
        //playerImage是一个UI
        playerImage.rectTransform.sizeDelta = new Vector2(20, 20);//设置playerImage大小
        //将playerImage设置到背景图上位置
        playerImage.rectTransform.SetParent(transform,false);//设置其父物体,父物体为挂载脚本的物体
        playerImage.rectTransform.anchoredPosition = new Vector2(0, 0);//设置playerImage位置
        //小地图是2D,所以旋转在Z轴进行,每次旋转角度为player的旋转(3D上的旋转,基于Y轴旋转)
        playerImage.rectTransform.eulerAngles = new Vector3(0, 0, -player.eulerAngles.y);
        playerImage.sprite = Resources.Load<Sprite>("Texture/Player");//加载图片        
    }
}
  • 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

效果
在这里插入图片描述
(9)实现敌人自动寻路到玩家,但此时在小地图上并没有显示敌人。
创建一个脚本,命名为EnemyAI,并挂载在Enemy上
代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyAI : MonoBehaviour
{
    private Transform player;

    private Vector3 tempPos;
    // Start is called before the first frame update
    void Start()
    {
        player = GameObject.FindWithTag("Player").transform;
    }

    // Update is called once per frame
    void Update()
    {
        tempPos = player.position;
        tempPos.y = transform.position.y;
        transform.LookAt(tempPos);//使敌人面向player
        transform.Translate(Vector3.forward*Time.deltaTime*2);//向玩家移动
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

(10)创建一个脚本,命名PlayLittleControl,挂载到Player,用来判断要不要在小地图上显示敌人。
显示敌人条件:玩家周围10米内如果有敌人,则在小地图上显示。否则不显示。
算法:计算玩家和敌人之间的距离
if(距离<=10)
{
     绘制
    如果距离=10,则图表绘制在小地图边缘位置;
     如果小于10,获取到小地图的宽、高,用(距离/10)*宽或高,就是图标显示在小地图上的位置。
}
else
{
     不绘制
}
PlayLittleControl代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PlayLittleControle : MonoBehaviour
{
    private LittleMap littleMap;

    private GameObject enemy;
    private Image enemyImage;

    private bool isCreate;
    // Start is called before the first frame update
    void Start()
    {
        isCreate = true;
        littleMap = GameObject.Find("ShowLittleMap").GetComponent<LittleMap>();
        enemy = GameObject.FindWithTag("Enemy");
    }

    // Update is called once per frame
    void Update()
    {
        Jiance();
        //玩家移动
        float horizontal = Input.GetAxis("Horizontal");
        float vertial = Input.GetAxis("Vertical");
        if (horizontal != 0 || vertial != 0)
          {
              Vector3 dir = new Vector3(horizontal, 0, vertial);
              transform.LookAt(transform.position+dir);
              transform.Translate(Vector3.forward*Time.deltaTime*5);
           }
    }

    private void Jiance()//检测方法,玩家10米范围内是否有敌人
    {
        float dis = Vector3.Distance(transform.position, enemy.transform.position);//计算玩家和敌人距离
        float x = (enemy.transform.position.x - transform.position.x)/10.0f;//求x方向上距离,除10是求出比值
        //二维世界的Y方向对应的是三维世界的Z方向,三维世界Y方向是不变的
        float y = (enemy.transform.position.z - transform.position.z)/10.0f;
        //上面的X、Y是应用到二维小地图上的
        if (dis <= 10&&isCreate)
        {
            enemyImage=LittleMap.CreateEnemyImage();//静态方法要用类名.来调用
            isCreate = false;
        }

        if (!isCreate)
        {
            littleMap.ShowEnemyImage(enemyImage,x,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
  • 54
  • 55
  • 56

Little Map添加代码

public void ShowEnemyImage(Image image,float disX,float disY)//显示敌人图标
{
    image.rectTransform.sizeDelta = new Vector2(20, 20);
    image.rectTransform.anchoredPosition = new Vector2(disX*50,disY*50);//因为项目中小地图为100X100,player位于中心,所以计算小地图中显示位置应该*50
    image.rectTransform.SetParent(transform,false);
    image.sprite = Resources.Load<Sprite>("Texture/Enemy");
}

public static Image CreateEnemyImage()//生成敌人图标
{
    return Instantiate(LittleMap.item);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

(11)最后效果
在这里插入图片描述
PS:
如果想显示玩家在小地图上位置,并不断变化的情况。
解决办法:
获取地面的宽和高,将小地图当做缩小比例的地面,通过地面与小地图的比例,来确定玩家图标在小地图上位置。

如有问题,欢迎留言讨论( =•ω•= )m

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/134833?site
推荐阅读
相关标签
  

闽ICP备14008679号