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. 解决方案:带格式化文本控件( RichText)的模板如果在InfoPath的浏览器中加载可能出现 COM 组件的80040154错误

      建议大家在微软的组件出现问题时,在GOOGLE上搜索解决方案,一般来说,总有结果:  带格式化文本控件( RichText)的模板如果在InfoPath的浏览器中加载,可能出现 COM 组件的80 ...

  2. Android NDK环境搭建及调用JNI的简单步骤

    转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3396595.html Java Native Interface (JNI)标准是java平台的一部分 ...

  3. <转>最新版SDWebImage的使用

    我之前写过一篇博客,介绍缓存处理的三种方式,其中最难,最麻烦,最占内存资源的还是图片缓存,最近做的项目有大量的图片处理,还是采用了SDWebImage来处理,但是发现之前封装好的代码报错了.研究发现, ...

  4. 【代码笔记】iOS-清除图片缓存UIActionSheet

    一,效果图. 二,代码. RootViewController.m //点击任何处出现sheet -(void)touchesBegan:(NSSet *)touches withEvent:(UIE ...

  5. LAMP配置虚拟目录

    1.  httpd.conf中添加 Listen 81 2. 1 <VirtualHost 127.0.0.2:81> 2 DocumentRoot E:\ws\2011\DiscuzSp ...

  6. 安装centos 7后恢复windows 2008R2 (Windows7)启动项

    安装CentOS 7,安装之后发现Win2008R2的启动项不见了(Windows7同理).一般安装Linux过程中会自动识别windows系统并添加引导项,centos的问题在于默认不支持ntfs分 ...

  7. JavaScript(六)——实现图片上下或者左右无缝滚动

    /*! jQuery v1.8.3 jquery.com | jquery.org/license */ (function(e,t){function _(e){var t=M[e]={};retu ...

  8. mysql执行计划

         烂sql不仅直接影响sql的响应时间,更影响db的性能,导致其它正常的sql响应时间变长.如何写好sql,学会看执行计划至关重要.下面我简单讲讲mysql的执行计划,只列出了一些常见的情况, ...

  9. 0014 Java学习笔记-集合-HashMap集合

    主要的方法 + 构造方法: * HashMap(); - 默认大小16,负载因子0.75 * HashMap(int initialCapacity); * HashMap(int initialCa ...

  10. jquery简单入门(一)

    相关: 本文参考<锋利的jQuery第二版> 写在前面: jQuery作为javascript框架,是做网页交互工作者,一个值得学习的优秀的前端框架... 百度指数分析:(http://i ...