黄焖鸡米饭啊 2017-05-24 10:03 采纳率: 50%
浏览 1923

unity 3D 游戏里小地图制作的问题

public class smallMap : MonoBehaviour {

//大地图地形对象
GameObject plane;
//大地图主角对象
GameObject cube;

//大地图的宽度
float mapWidth;
//大地图的高度
float mapHeight;
//地图边界的检测数值
float widthCheck;
float heightCheck;

//小地图主角的位置
float mapcube_x = 0;
float mapcube_y = 0;


//GUI按钮是否被按下
bool keyUp;
bool keyDown;
bool keyLeft;
bool keyRight;

//小地图的背景贴图
public Texture map;
//小地图的主角贴图
public Texture map_cube;

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

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

    //根据比例计算小地图“主角”的坐标
    //GUI 坐标是左上角为起点和屏幕坐标以左下角为起点
    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));
  //  mapcube_y =((map.height / mapHeight * z) + (map.height / 2));
}

}

极度不明白最后求小地图主角坐标的两行代码,求大神做详细解释!!!

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 逻辑谓词和消解原理的运用
    • ¥15 三菱伺服电机按启动按钮有使能但不动作
    • ¥15 js,页面2返回页面1时定位进入的设备
    • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
    • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
    • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
    • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
    • ¥20 腾讯企业邮箱邮件可以恢复么
    • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
    • ¥15 错误 LNK2001 无法解析的外部符号