Unity制作小地图和方向导航
作者:u010989951 发布时间:2023-02-07 16:51:02
标签:Unity,地图,导航
一、unity方向导航制作
设计要求是方向导航随着鼠标旋转转换方向,效果图如下:
具体的实现方法主要有两个步骤,分别为UI设计和脚本编写。我的设计思路是这个控件分为两层,第一层为东西南北指示层,第二层为图标指示层,这里我的图标采用圆形图标,方向指示这里采用控制图标旋转的方式实现,层级关系如下:
首先创建父节点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小地图的制作
关于小地图的制作,网上各种帖子铺天盖地,然而仔细看却发现大部分都一样,互相抄袭,很多都是没用的。各种帖子大都采用是正交相机的方式显示小地图,然而这个地图是真实场景的俯视,我们需要的往往是像英雄联盟那样的小地图,这里我采用一种简单的方式实现小地图。废话不说先上效果图:
这里的地图只是一张图片,这增加了地图的灵活性,这里的小地图创建跟上面方向导航类似,所不同的是脚本的编写方式。
具体的实现也是分为两个步骤,分别为UI的设计和代码的编写。
第一步:地图UI的设计
层级关系如图:
父节点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


猜你喜欢
- springboot去除控制台打印的debug日志1.创建logback-spring.xml文件文件内容如下<?xml versio
- 在我们对gc中的算法有基本概念理解后,要把算法的理念实现还需要依托实际垃圾收集器的使用。因为光靠一些简单的原理不足以支撑整个程序的运行,在回
- 一、效果实现二、实现思路:1. 正上方的提示区域,用一个类(LockIndicator.java)来实现,自定义view来绘制9个提示图标;
- 1.首先是编辑器的乱码,这个很好解决,file->settings->appearence里面有个Name设置成支持中文的字 体
- 首先选择保存图片的路径:saveFileDialog1.Title = "保存"; &
- 由于MediaPlayer占用资源较多,且不支持同时播放多个音频,所以Android还提供了另一个播放音频的类-----SoundPool。
- 本文分为俩部分:第一部分介绍如何给Eclipse安装Spring Boot开发插件spring tool suite(简称STS);第二部分
- 一、创建项目并导入相关依赖<dependency> <groupId>org.springframewo
- 本文实例为大家分享了C#实现学生成绩管理系统的具体代码,供大家参考,具体内容如下使用链表写学生成绩管理系统链表可以灵活的展示增删改查下面是结
- 本文实例为大家分享了java实现简单猜数字的具体代码,供大家参考,具体内容如下代码不多说,图片自加,实现功能有数字比大小,菜单开始,帮助,退
- MainActivity如下:package cc.ab;import android.os.Bundle;import android.p
- 前言:本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析。一.最常见方式(未必最
- Mybatis-Plus将字段设置为null项目场景:最近在做一个需求的时候需要把数据库中的某个字段设置为空问题描述:在代码中通过set方法
- 一、项目简述功能包括(管理员和用户角色): 酒店预订,酒店管理,员工管理,入住原理,订单管理, 楼层管理,退房管理,营业额报表等等。二、项目
- 前言:在Java面试中,线程的状态也是被经常考察的知识点,今天我们就来聊一聊线程状态的那些事!线程在JVM中的状态查看线程在JVM中有哪些不
- 今天突然想起来,java产生随机数的问题,上机试了一下,找到了一点区别,在这里总结一下;直接调用Math.random()是产生一个[0,1
- Mybatis 逆向工程 逆向工程通常包括由数据库的表生成 Java 代码 和 通过 Java 代码生成数据库表。而Mybatis 逆向工
- Spring和SpringMVC的容器具有父子关系,Spring容器为父容器,SpringMVC为子容器,子容器可以引用父容器中的Bean,
- 既然是一个网关。那么全局过滤器肯定是少不了的一个存在。像是鉴权、认证啥的不可能每个服务都做一次,一般都是在网关处就搞定了。Zuul他就有很强
- 发现问题:之前用springAOP做了个操作日志记录,这次在往其他类上使用的时候,service一直注入失败,找了网上好多内容,发现大家都有