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);
  }
  }
  }

 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Unity3D实现导航效果

    介绍: unity界面开发,会用到很多导航的按钮,他们是公共的,单击其中一个按钮,显示对应的界面. unity中,UGUI自带Toggle组件,NGUI也有Toggle复选框,都方便了开发者的开发.但是只有合适自己才是王道. 今天,就用普通的按钮组建,来编写自己的导航. 导航的组成: 总控制 按钮组 面板组 步骤: 编写脚本:<NavigationButton>  控制按钮的高亮,动画等. 编写脚本:<NavigationPanel>   控制面板的显示和关闭. 编写脚本:<

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

    一.unity方向导航制作 设计要求是方向导航随着鼠标旋转转换方向,效果图如下: 具体的实现方法主要有两个步骤,分别为UI设计和脚本编写.我的设计思路是这个控件分为两层,第一层为东西南北指示层,第二层为图标指示层,这里我的图标采用圆形图标,方向指示这里采用控制图标旋转的方式实现,层级关系如下: 首先创建父节点1,然后在父节点下创建子节点2,3:最后调整好位置. 第二步脚本编写,脚本如下: using UnityEngine; using System.Collections; using Uni

  • 利用Unity制作特写镜头的示例代码

    目录 类似这种效果 1.首先制作上下两层黑边 2.摄像头聚焦的效果 类似这种效果 黑边的大小可以自行调整 这里为了方便直接用两个Button绑定了方法,有需要自行调用方法 1.首先制作上下两层黑边 创建Canvas然后在canvas上新建空物体,命名为CinemaCloseUpShot 在上面新建脚本CinemaCloseUP public class CinemaCloseUP : MonoBehaviour { public float targetSizeInput; //上下黑条的宽度

  • Unity制作图片字体的方法

    本文实例为大家分享了Unity制作图片字体的具体代码,供大家参考,具体内容如下 主要步骤: 1.新建一个字体. 2.新建一个材质. 3.把上一步新建的材质赋值给第一步创建的字体. 4.设置字体的Character Rects的大小来划分字体. 例如划分这个图片,因其要分为12个字体所以Character Rects大小为12: Character Rects中每个单元格的计算方式如图所标记(比较的复杂,了解怎么计算就行,后期通过编辑器可以计算出来.) 5.把设置好的字体直接赋值给Text中的Fo

  • 一篇文章教会你用Unity制作网格地图生成组件

    目录 前言 1,创建组建出网格的基本单元 2,编辑网格创建脚本 3,地图生成案例 总结 前言 如果你玩过三国志这种类型的战旗游戏或者模拟城市.部落冲突.海岛奇兵这种模拟经营类的游戏,那么你对网格地图一定不会陌生.在这些游戏中,所有地图场景中的物体都是基于整齐的网格来记录位置等信息.如下图: 如果你还是感知不到什么是网格地图.俄罗斯方块或者贪吃蛇你一定不会陌生,物体的存在是依托于规整的网格地图而存在的. 还是一如既往,本篇文章为零基础小白文,如果你是小萌新,并且对网格地图感兴趣的话,可以学习本片文

  • Unity 制作一个分数统计系统

    项目中经常遇到分数统计的需求,例如我们执行了某项操作或做了某个题目,操作正确则计分,相反则不计分失去该项分数,为了应对需求需要一个分数统计系统. 首先定义一个分数信息的数据结构,使用Serializable特性使其可序列化: using System; using UnityEngine; namespace SK.Framework { /// <summary> /// 分数信息 /// </summary> [Serializable] public class ScoreI

  • 基于Unity制作一个简易的计算器

    目录 一.前言 二.效果图及源工程 三.实现 1.界面搭建 2.代码实现 四.后记 一.前言 Hello,又见面了,今天分享如何使用Unity制作计算器,难度中等,可以用来学习,或者当成其他项目的小组件导入. 当然,也可以导出来,发布到网页端,来做一个嵌入式工具也可以. 二.效果图及源工程 效果图: 源工程 三.实现 1.界面搭建 所有的按钮摆放到Background下面. 2.代码实现 首先找到所有的按钮,添加到事件: //结果显示 TextComputeProcess = GameObjec

  • unity制作瞄准镜效果

    使用unity制作瞄准镜,供大家参考,具体内容如下 一.创建场景 在Hierarchy窗口中使用Plane和Cube创建场景,并调整摄像机位置 二.使用步骤 1.在Hierarchy窗口中右击在UI中选择Image 2.将瞄准镜素材拖入Image的检视试图中Soure Image中 结果如下: (注意在导入图片时将图片类型更改为下图所示,更改完之后点击Apply) 3.调整瞄准镜位置 三.新建代码 代码如下(示例): using UnityEngine; using System.Collect

  • Unity制作游戏自定义按键详解

    目录 一.效果图 二.布局 1.场景布局 2.设置面板布局 三.脚本思路 1.KeyItem脚本 2.SetKeyPanle脚本 3.player移动脚本 一.效果图 二.布局 1.场景布局 创建一个Panel 创建三个cube,Panel地板 两个cube设置一个绿色材质,调整Scale大小让其成为柱子形状,一个cube改名为player设置一个红色材质,当作玩家(用来演示操作的),修改相机位置就可以了. 2.设置面板布局 2.1新建一个空节点名字改为SetKeyPanle,修改属性 2.2在

  • 用jquery的方法制作一个简单的导航栏

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>学习导航栏的制作</title> <script src="http://code.jquery.com/jquery-1.10.2.js"></script> <script> $(document).ready(function() {

  • 第1个Android应用程序 Android制作简单单页导航

    本例子演示如何添加一个简单的单页导航,在此基础上,再演示如何在第2个页面中显示第1个页面中拨打过的所有电话号码. (1)通过该例子理解Android App的基本架构. (2)通过该例子理解实现Android多屏幕导航的基本技术. 本例子只是为了让我们对Android App开发有一个较全面的感性认识,读者不必一开始就纠结于代码中的细节问题,涉及到的相关概念在后面还会分别介绍. 运行截图 运行截图(Api19.Api21.Api23的实现代码都相同): 界面操作 单击"将文本转换为数字"

随机推荐