Unity制作小地图和方向导航

作者:u010989951 时间:2023-02-07 16:51:02 

一、unity方向导航制作

设计要求是方向导航随着鼠标旋转转换方向,效果图如下:

Unity制作小地图和方向导航Unity制作小地图和方向导航

具体的实现方法主要有两个步骤,分别为UI设计和脚本编写。我的设计思路是这个控件分为两层,第一层为东西南北指示层,第二层为图标指示层,这里我的图标采用圆形图标,方向指示这里采用控制图标旋转的方式实现,层级关系如下:

Unity制作小地图和方向导航

首先创建父节点1,然后在父节点下创建子节点2,3;最后调整好位置。

第二步脚本编写,脚本如下:


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

public class shijiao : MonoBehaviour
{
public GameObject Gcanvas;
public GameObject UIzhinanpicture;
public GameObject Terren;
public GameObject SMAP;
//public GameObject bnt=GameObject.Find("Button");
//方向灵敏度
public float sensitivityX = 10F;
public float sensitivityY = 10F;

//上下最大视角(Y视角)
public float minimumY = -60F;
public float maximumY = 60F;
float rotationY = 0F;
static public bool ifcanvas;
void Update()
{
if(Input.GetMouseButton (0)){
//按住鼠标左键才能调节角度,根据鼠标移动的快慢(增量), 获得相机左右旋转的角度(处理X)
float rotationX = transform.localEulerAngles.y + Input.GetAxis ("Mouse X") * sensitivityX;

//根据鼠标移动的快慢(增量), 获得相机上下旋转的角度(处理Y)
rotationY += Input.GetAxis ("Mouse Y") * sensitivityY;
//角度限制. rotationY小于min,返回min. 大于max,返回max. 否则返回value
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);

//总体设置一下相机角度
transform.localEulerAngles = new Vector3 (-rotationY, rotationX, 0);
 UIzhinanpicture.transform.localEulerAngles = new Vector3(0,0,- rotationX);
}
}
}

二、unity小地图的制作

关于小地图的制作,网上各种帖子铺天盖地,然而仔细看却发现大部分都一样,互相抄袭,很多都是没用的。各种帖子大都采用是正交相机的方式显示小地图,然而这个地图是真实场景的俯视,我们需要的往往是像英雄联盟那样的小地图,这里我采用一种简单的方式实现小地图。废话不说先上效果图:

Unity制作小地图和方向导航

Unity制作小地图和方向导航

这里的地图只是一张图片,这增加了地图的灵活性,这里的小地图创建跟上面方向导航类似,所不同的是脚本的编写方式。

具体的实现也是分为两个步骤,分别为UI的设计和代码的编写。

第一步:地图UI的设计

层级关系如图:

Unity制作小地图和方向导航

父节点1为背景地图,子节点2为蓝色箭头,蓝色箭头表示目标目前所在的位置。这两个节点仅仅是图片控件。

第二步:脚本的编写

脚本如下:


using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System;
using UnityEngine.EventSystems;

public class shijiao : MonoBehaviour
{
public GameObject Gcanvas;//画布
public GameObject UIzhinanpicture;
public GameObject Terren;//大地
public GameObject SMAP;//小地图指针
public GameObject SMAPBK;//小地图背景
GameObject Cm;

//方向灵敏度
public float sensitivityX = 10F;
public float sensitivityY = 10F;

//上下最大视角(Y视角)
public float minimumY = -60F;
public float maximumY = 60F;

//山地的大小
float Twidth;
float Tlongth;
//地图大小
float mapwidth;
float maplongth;
//比例大小
static public float widthScale;
static public float longthscal;
//图片缩放比例
//比例大小
//static public float PwidthScale;
//static public float Plongthscal;

float rotationY = 0F;
static public bool ifcanvas;
private float movespeed = 20;
CharacterController ctrlor;
void Start ()
{
RenderSettings.fog = false;
ifcanvas =true;
Gcanvas.SetActive (ifcanvas);
Cm = GameObject.Find("Mcam");
ctrlor = GetComponent<CharacterController>();
Twidth=Terren.GetComponent<Collider>().bounds.size.x;
Tlongth =Terren.GetComponent<Collider>().bounds.size.z;
mapwidth = SMAPBK.GetComponent<RectTransform>().rect.width;
maplongth = SMAPBK.GetComponent<RectTransform>().rect.height;
widthScale =(mapwidth) /Twidth;
longthscal =(maplongth) /Tlongth;
SMAP.transform.localPosition= new Vector3(Cm.transform.position.x* widthScale- 50, Cm.transform.position.z* longthscal-50,0);
}
void Update()
{
if (Input.GetMouseButton (1)) {

ifcanvas = true;
Gcanvas.SetActive (ifcanvas);
}
else{
if (Input.GetKey(KeyCode.Escape))
{
ifcanvas = false;
Gcanvas.SetActive (ifcanvas);
}
if (!EventSystem.current.IsPointerOverGameObject())
{
//W键前进
if (Input.GetKey (KeyCode.W)) {
 Vector3 forward = transform.TransformDirection(Vector3.forward);
 ctrlor.Move(forward*movespeed*Time.deltaTime);

}
//S键后退
if (Input.GetKey(KeyCode.S))
{
 Vector3 back = transform.TransformDirection(Vector3.back);
 ctrlor.Move(back * movespeed * Time.deltaTime);

}
//A键移动
if (Input.GetKey(KeyCode.A))
{
 Vector3 left = transform.TransformDirection(Vector3.left);
 ctrlor.Move(left* movespeed * Time.deltaTime);
}
//D键后退
if (Input.GetKey(KeyCode.D) && gameObject.transform.position.y > 0)
{
 Vector3 right = transform.TransformDirection(Vector3.right);
 ctrlor.Move(right * movespeed * Time.deltaTime);
}
//E键升高
if (Input.GetKey (KeyCode.E)) {
 Vector3 upward = transform.TransformDirection(Vector3.up);
 ctrlor.Move(upward * movespeed * Time.deltaTime);
}
SMAP.transform.localPosition = new Vector3(Cm.transform.position.x * widthScale - 50, Cm.transform.position.z * longthscal - 50, 0);
if (Input.GetMouseButton (0)){
//根据鼠标移动的快慢(增量), 获得相机左右旋转的角度(处理X)
float rotationX = transform.localEulerAngles.y + Input.GetAxis ("Mouse X") * sensitivityX;

//根据鼠标移动的快慢(增量), 获得相机上下旋转的角度(处理Y)
rotationY += Input.GetAxis ("Mouse Y") * sensitivityY;
//角度限制. rotationY小于min,返回min. 大于max,返回max. 否则返回value
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);

//总体设置一下相机角度
transform.localEulerAngles = new Vector3 (-rotationY, rotationX, 0);
 UIzhinanpicture.transform.localEulerAngles = new Vector3(0,0,- rotationX);
 SMAP.transform.localEulerAngles = new Vector3(0, 0, -rotationX);
}
}
}

}
}

来源:https://blog.csdn.net/u010989951/article/details/52316578

标签:Unity,地图,导航
0
投稿

猜你喜欢

  • C#中字符串编码处理

    2023-10-03 09:56:12
  • Spring MVC基于注解的使用之JSON数据处理的方法

    2022-06-02 14:02:43
  • Android性能优化之plt hook与native线程监控详解

    2021-09-10 22:06:01
  • 关于线程池你不得不知道的一些设置

    2021-06-08 11:34:45
  • Java实现高校教务系统

    2022-05-16 04:24:17
  • Android串口通讯SerialPort的使用详情

    2022-03-08 00:23:46
  • java使用jaxb操作xml示例

    2023-11-05 15:02:18
  • Java关于IO流的全面介绍

    2023-08-12 08:14:46
  • 深入浅析Java反射机制

    2023-11-25 07:02:03
  • MFC程序设计常用技巧汇总

    2023-11-02 20:37:12
  • WPF实现绘制扇形统计图的示例代码

    2021-11-29 23:42:00
  • Spring AOP的概念与实现过程详解

    2023-02-17 02:54:12
  • Android实现购物车添加商品特效

    2021-06-25 22:59:45
  • Spring Boot 集成Elasticsearch模块实现简单查询功能

    2022-09-05 06:31:31
  • Java五种方式实现多线程循环打印问题

    2023-03-07 20:34:12
  • Java编程实现高斯模糊和图像的空间卷积详解

    2022-06-18 10:44:34
  • Java虚拟机栈jvm栈的作用

    2023-11-10 13:52:15
  • WinForm中KeyDown,KeyPress和KeyUp的顺序与区别解析

    2023-06-30 22:34:36
  • Android 文件下载三种基本方式

    2023-02-26 08:21:48
  • Android WebView开发之自定义WebView工具框

    2023-01-12 13:41:43
  • asp之家 软件编程 m.aspxhome.com