minmap
小地图的计算方式还有大小有问题
Minmap.cs
using UnityEngine;
using System.Collections;
public class Minmap : MonoBehaviour {
GameObject plane;
GameObject cube;
float mapWidth;
float mapHeight;
float widthCheck;
float heightCheck;
float mapcube_x =0;
float mapcube_y =0;
bool keyUp;
bool keyDown;
bool keyLeft;
bool keyRight;
public Texture map;
public Texture map_cube;
// Use this for initialization
void Start () {
plane = GameObject.Find("Plane");
cube = GameObject.Find ("Cube");
float size_x = plane.GetComponent<MeshFilter> ().mesh.bounds.size.x; //??
float scal_x = plane.transform.localScale.x;
float size_z = plane.GetComponent<MeshFilter> ().mesh.bounds.size.z;
float scal_z = plane.transform.localScale.z;
mapWidth = size_x * scal_x;
mapHeight = size_z * scal_z;
widthCheck = mapWidth / 2;
heightCheck = mapHeight / 2;
check ();
}
void OnGUI(){
keyUp=GUILayout.RepeatButton("向前移动");
keyDown=GUILayout.RepeatButton("向后移动");
keyLeft=GUILayout.RepeatButton("向左移动");
keyRight=GUILayout.RepeatButton("向右移动");
GUI.DrawTexture (new Rect (Screen.width - map.width, 0, map.width, map.height),map);
GUI.DrawTexture (new Rect (mapcube_x, mapcube_y, map_cube.width, map_cube.height), map_cube);
}
// Update is called once per frame
void Update () {
}
void FixedUpdate(){
if (keyUp) {
cube.transform.Translate(Vector3.forward * Time.deltaTime * 5);
check();
}
if (keyDown) {
cube.transform.Translate(-Vector3.forward * Time.deltaTime * 5);
check();
}
if (keyLeft) {
cube.transform.Translate(-Vector3.right * Time.deltaTime * 5);
check();
}
if (keyRight) {
cube.transform.Translate(Vector3.right * Time.deltaTime * 5);
check();
}
}
void check(){
float x = cube.transform.position.x;
float z = cube.transform.position.z;
if (x >= widthCheck) {
x =widthCheck;
}
if (x <= -widthCheck) {
x = -widthCheck;
}
if (z >= heightCheck) {
z = heightCheck;
}
if (z <= -heightCheck) {
z = -heightCheck;
}
cube.transform.position = new Vector3 (x, cube.transform.position.y, z);
mapcube_x = (map.width / mapWidth * x) + ((map.width / 2) - (map_cube.width / 2)) + (Screen.width - map.width);
mapcube_y = map.height - ((map.height/mapHeight * z)+(map.height/2));
}
}
搞定计算方式 了 期间又犯了 坐标原点不一致导致的计算错误 与教程不一样是由于 plane与cube 都不在原点 计算值时得考虑当前坐标
新的代码 计算上改了很多
using UnityEngine;
using System.Collections;
public class Minmap : MonoBehaviour {
GameObject plane;
GameObject cube;
float mapWidth;
float mapHeight;
float widthCheck;
float heightCheck;
float mapcube_x =0;
float mapcube_y =0;
float planePostion_x;
float planePostion_z;
bool keyUp;
bool keyDown;
bool keyLeft;
bool keyRight;
public Texture map;
public Texture map_cube;
float size_x;
float size_z;
float scal_x;
float scal_z;
// Use this for initialization
void Start () {
plane = GameObject.Find("Plane");
cube = GameObject.Find ("Cube");
size_x = plane.GetComponent<MeshFilter> ().mesh.bounds.size.x; //默认长宽
scal_x = plane.transform.localScale.x; //当前缩放
size_z = plane.GetComponent<MeshFilter> ().mesh.bounds.size.z;
scal_z = plane.transform.localScale.z;
//float csize_x =
mapWidth = size_x * scal_x; //模型尺寸
mapHeight = size_z * scal_z;
planePostion_x = plane.transform.position.x; //plane的x,z坐标
planePostion_z = plane.transform.position.z;
widthCheck = mapWidth / 2; //边界值 其实就是 250 不过实际判定时得加上当前坐标 还有cube的长宽
heightCheck = mapHeight / 2;
check (); //边界也有问题
}
//plane.GetComponent<Renderer>().bounds.size.x 返回真实模型尺寸
void OnGUI(){
keyUp=GUILayout.RepeatButton("向前移动");
keyDown=GUILayout.RepeatButton("向后移动");
keyLeft=GUILayout.RepeatButton("向左移动");
keyRight=GUILayout.RepeatButton("向右移动");
GUI.DrawTexture (new Rect (Screen.width - mapWidth*0.2f, 0,mapWidth*0.2f,mapHeight *0.2f),map);
//gui图片自动嵌套???
GUI.DrawTexture (new Rect (mapcube_x, mapcube_y,0.02f*mapWidth*0.2f,0.02f* mapHeight*0.2f), map_cube);
GUILayout.Label (cube.transform.position.x + "\n" + cube.transform.position.z);
GUILayout.Label (mapcube_x + "\n" + mapcube_y);
}
// Update is called once per frame
void Update () {
}
void FixedUpdate(){
if (keyUp) {
cube.transform.Translate(Vector3.forward * Time.deltaTime * 50);
check();
}
if (keyDown) {
cube.transform.Translate(-Vector3.forward * Time.deltaTime * 50);
check();
}
if (keyLeft) {
cube.transform.Translate(-Vector3.right * Time.deltaTime * 50);
check();
}
if (keyRight) {
cube.transform.Translate(Vector3.right * Time.deltaTime * 50);
check();
}
}
void check(){
float x = cube.transform.position.x;
float z = cube.transform.position.z;
if (x >= (widthCheck + planePostion_x - 5)) {
x =widthCheck + planePostion_x-5;
}
if (x <= (planePostion_x - widthCheck+5)) {
x = planePostion_x - widthCheck+5;
}
if (z >= (planePostion_z + heightCheck-5)) {
z = planePostion_z + heightCheck-5;
}
if (z <= (planePostion_z - heightCheck+5)) {
z = planePostion_z - heightCheck+5;
}
cube.transform.position = new Vector3 (x, cube.transform.position.y, z);
mapcube_x = Screen.width - mapWidth * 0.2f + ((x - (planePostion_x - 250)) / 500) * mapWidth * 0.2f;
mapcube_y = mapHeight*0.2f- ((z - (planePostion_z - 250)) / 500) * mapHeight * 0.2f;
}
}