http://blog.csdn.net/cube454517408/article/details/7907247  首先是参考此文;

main.cs作用:1.大图的拆分

   2.判断是否成功

       3.对碎片随机分配位置

4.按键的响应

pain.cs:针对每一个小plane,1.响应鼠标的拖拽

              2.判断是否到达目的地

               

本文为第一步大图拆分成多个碎片,让background的宽x占屏幕1/4

正交投影下:

怎么拆分成多个plane?

1.纹理的裁剪(以左下角为坐标原点)--->2.裁剪的纹理scale缩放;以此局部texture匹配整个plane大小----->plane缩小

怎么让plane的x长占屏幕固定比例?

1、首先,在正交投影下,渲染屏幕的宽是由camera的size决定的;

2、那么我们只要获取plane的size;然后通过plane的scale来缩放即可;也即一个比例关系求出scale;(本次只考虑plane的长宽相等情况)

怎么让plane移动到右侧,靠着右侧边缘?

1、渲染屏幕的长度L为:camera的size乘以2再乘以W/H宽高比;camera的size为width的一半

2、那么BackPlane的中心点向右移动的坐标为:L/2-plane.size.x*scale.x/2

结果如下:

如上图:验证拆分成功。

疑问:一直不知道初始设置的1280X720怎么获取,文档里screen.width获取的是current resolution运行时分辨率。

以下为代码:

using UnityEngine;
using System.Collections;
using UnityEditor;

/******************************
 * main
 * 1.切图,分割,
 * 2.移位到最右侧
 *
 * /
*/

public class main : MonoBehaviour
{
    public GameObject mPlane;
    public GameObject mPlaneParent;
    public GameObject mBackGround;

    private GameObject[] mPlaneAll;
    public Vector3[] mtestPos;         //测试拆分用;

    public int mXNums;//水平线的个数;最少为两个;共有(mXNums-1)*(mYNums-1)张碎片
    public int mYNums;//竖直线的个数;

    public int mPlaneRatio = 4;//水平比例为1/4

    private Vector2 mBlock;
    private Vector2 mTextureBlock;
    private float mPicLength;
    private Vector2 mLeftTopCood;
    public void Awake()
    {
        Screen.fullScreen = !Screen.fullScreen;
    }

    //本次只考虑plane长宽相等的情况
    // Use this for initialization
    void Start()
    {
        float planeX = mBackGround.GetComponent<MeshFilter>().mesh.bounds.size.x;
        float planeY = mBackGround.GetComponent<MeshFilter>().mesh.bounds.size.y;
        float planeZ = mBackGround.GetComponent<MeshFilter>().mesh.bounds.size.z;
        Debug.Log("x:" + planeX + "y:" + planeY + "z:" + planeZ);

        float W = Screen.width;
        float H = Screen.height;
        float C = Camera.main.orthographicSize;
        Debug.Log("orthographicSize:" + C);
        float M = mPlaneRatio;
        float P = planeX;

        float mScale = (W / H) * 2 * (C / M) / P;
        Debug.Log("scale:" + mScale);

        mBackGround.transform.localScale = new Vector3(mScale, 1.0f, mScale);

        mPicLength = mBackGround.transform.localScale.x;
        mBlock.x = mPicLength / (mXNums - 1);
        mBlock.y = mPicLength / (mYNums - 1);

        mTextureBlock.x = 1.0f / (mXNums - 1);
        mTextureBlock.y = 1.0f / (mYNums - 1);

        float W_long = C*W/H;
        float new_x = W_long - planeX*mScale/(2.0f);
        mBackGround.transform.localPosition = new Vector3(new_x, mBackGround.transform.localPosition.y, mBackGround.transform.localPosition.z);

    }

    void OnGUI()
    {
        if (GUI.Button(new Rect(10, 10, 100, 30), "拆分"))
        {
            Split();
        }
    }

    void Split()//1.生成(mXNums-1)*(mYNums-1)张碎片; 2.随机分配位置 3.每张碎片不重叠
    {
        mPlaneAll = new GameObject[(mXNums - 1) * (mYNums - 1)];

        int k = 0;

        for (int i = 0; i < mXNums - 1; i++)//X轴的分割
        {
            for (int j = 0; j < mYNums - 1; j++)
            {
                mPlaneAll[k] = (GameObject)Instantiate(mPlane);

                mPlaneAll[k].name = "plane" + k;
                mPlaneAll[k].transform.parent = mPlaneParent.transform;

                mPlaneAll[k].transform.localScale = new Vector3(mBlock.x, 1, mBlock.y);//使每个plane缩小到一个碎片的大小;注意Plane经过旋转后,scale坐标系发生了变化;

                //计算纹理的偏移offset(把中心点移位到左下角,依照LeftTop进行每块纹理坐标的获取)
                float offset_x = mTextureBlock.x * i;//按照网格的“每一列”算
                float offset_y = 1.0f - mTextureBlock.y * (j + 1);            //纹理的偏移和外界的变化无关,只和:拆分的程度有关。
                //scaleTexture纹理缩小的比例
                float scale_x = mTextureBlock.x;
                float scale_y = mTextureBlock.y;

                mPlaneAll[k].renderer.material.mainTextureOffset = new Vector2(offset_x, offset_y);
                mPlaneAll[k].renderer.material.mainTextureScale = new Vector2(scale_x, scale_y);
                mPlaneAll[k].SetActive(true);
                k++;//planeAll数组中:第一列从上到下的碎片,第二列......最后一列
            }
        }

        for (int i = 0; i < (mXNums - 1) * (mYNums - 1); i++)
        {
            mPlaneAll[i].transform.localPosition = new Vector3(mtestPos[i].x, mtestPos[i].y, 0.0f);
        }
    }

    // Update is called once per frame
    void Update()
    {

    }
}

  

接下来做一下碎片的随机分配。

u3d_小游戏_拼图_1_生成碎片(非随机)的更多相关文章

  1. JS小游戏-蓝色拼图

    // a[href=#viewSource]"); //查看源代码标签 viewSourceArr.attr("title", "查看源代码"); v ...

  2. C语言-纸牌计算24点小游戏

    C语言实现纸牌计算24点小游戏 利用系统时间设定随机种子生成4个随机数,并对4个数字之间的运算次序以及运算符号进行枚举,从而计算判断是否能得出24,以达到程序目的.程序主要功能已完成,目前还有部分细节 ...

  3. 例子:js超级玛丽小游戏

    韩顺平_轻松搞定网页设计(html+css+javascript)_第34讲_js超级玛丽小游戏_学习笔记_源代码图解_PPT文档整理 采用面向对象思想设计超级马里奥游戏人物(示意图) 怎么用通过按键 ...

  4. 常用Java API之Ramdom--用代码模拟猜数小游戏

    常用Java API之Ramdom Ramdom类用来生成随机数字.使用起来也是三个步骤: 1.导包 import java.util.Random; 2.创建 Random r = new Rand ...

  5. JavaScript版拼图小游戏

    慕课网上准备开个新的jQuery教程,花了3天空闲时间写了一个Javascript版的拼图小游戏,作为新教程配套的分析案例 拼图游戏网上有不少的实现案例了,但是此源码是我自己的实现,所以不做太多的比较 ...

  6. canvas drag 实现拖拽拼图小游戏

    博主一直心心念念想做一个小游戏-  前端时间终于做了一个小游戏,直到现在才来总结,哈哈- 以后要勤奋点更新博客! 实现原理 1.如何切图? 用之前的方法就是使用photoshop将图片切成相应大小的图 ...

  7. 拼图小游戏之计算后样式与CSS动画的冲突

    先说结论: 前几天写了几个非常简单的移动端小游戏,其中一个拼图游戏让我郁闷了一段时间.因为要获取每张图片的位置,用`<style>`标签写的样式,直接获取计算后样式再用来交换位置,结果就悲 ...

  8. [deviceone开发]-拼图小游戏

    一.简介 九宫格小游戏,可从本地图库载入一张图片,填充到9个ImageView,另涉及Timer计时.图库控件. 每个格子都是相同的控件,动态添加到首页中的,在初始化后,响应touch事件,之后通过多 ...

  9. 使用NGUI实现拖拽功能(拼图小游戏)

    上一次用UGUI实现了拼图小游戏,这次,我们来用NGUI来实现 实现原理 NGUI中提供了拖拽的基类UIDragDropItem,所以我们要做的就是在要拖拽的图片上加一个继承于该类的脚本,并实现其中的 ...

随机推荐

  1. SharePoint 2013 在母版页中插入WebPart

    最近QQ群里有朋友问,如何在母版页里插入自己开发的WebPart.其实很简单,母版页中虽然不允许插入WebPartZone,但是Designer就可以插入WebPart:或者手动注册,然后插入WebP ...

  2. SharePoint Online 创建门户网站系列之首页布局

    前 言 SharePoint Online中创建首页布局,一般都是首先将美工提供的效果图,切图成为Html + Css + Script的形式,然后,将所有资源文件传到SharePoint Onlin ...

  3. SharePoint 2013 日历根据Category显示不同颜色

    最近有一个小需求,就是SharePoint的日历类型列表,用户希望根据Event里面的Category不同,在前台视图显示成不同的颜色,绞尽脑汁,想到这么个办法,分享给大家,希望有更好方法的也能留言推 ...

  4. UIWebView的应用和其中的JS与OC间传值

    现在有很多的应用已经采用了WebView和html语言结合的开发模式.html5一直很火因为一份代码可以在多个平台上运用啊,效果各不相同都很美观,也越来越有一些公司直接招后台程序员和html5程序员, ...

  5. Android SharedPreference的使用

    在<Android 在内部存储读写文件>一文中,谈到了登录用户名和密码的方法,通过读取内存文件来实现,但是会出现问题,因为登录名和密码的形式通过username##password的形式, ...

  6. android 比较完善json请求格式

    public static String getHttpText(String url) { if (MyApplication.FOR_DEBUG) { Log.i(TAG, "[getH ...

  7. 【Android】监听Notification被清除

    前言 一般非常驻的Notification是可以被用户清除的,如果能监听被清除的事件就可以做一些事情,比如推送重新计数的问题. 声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www ...

  8. 【VLC-Android】Mac下编译vlc-android

    前言 突然想整整VLC-Android,然后就下一个玩玩看,这里记录点遇到的问题. 声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: htt ...

  9. windows7 下伪静态配置方法

    今天终于算是彻底知道windows7下伪静态的IIS配置了.尼玛真坑爹,竟然64位的和32位的配置竟然不一样... 网上找的比较详细的文章地址: http://jingyan.baidu.com/ar ...

  10. Java Maps的9个常见问题

    一般来说,Map是一种由键值对组成的数据结构,其中键(key)在Map中是不能重复的: 本篇文章总结了9个最常见的问题(关于Java Map及其实现类): 出于简单考虑,在代码例子中我将不使用泛型,因 ...