使用NGUI模仿制作“切水果”

来源:互联网 发布:环境监测数据弄虚作假 编辑:程序博客网 时间:2024/04/30 15:03

只做学习之用,无任何商业元素
如有侵权,即删除

首先,载入NGUI包,完成后如下图所示:
这里写图片描述

新建一个Sprite
这里写图片描述

然后,设置UIRoot
这里写图片描述

注意:图中画圈的部分——Scaling Style设置为“Fixed Size On Mobiles“顾名思义,整个画面开启UI整体缩放支持(在手机中)
这里写图片描述

调整Main Camera的监控范围,使得和UIRoot下的Camera同样大小。

开始新建图集(Fruit)
这里写图片描述

将图片选中,所有图片就会出现在以后View Sprites下,如图
这里写图片描述

然后在刚才新建立的Sprite(改名为BackImg)中选择新建立的图集,选择已经准备好的背景图
这里写图片描述

将BackImg的Anchors
这里写图片描述
改为
这里写图片描述
并做好相应的设置——左对左,右对右,上对上,下对下,值设置为0,这样做是为了在任何手机分辨率下保持全屏。

这样,背景图制作完毕,接下来是刀子的制作:
刀子利用贝塞尔曲线(Line Renderer)制作,新建立一个Sprite(改名为KnifeLine),图集设置为”None“,如图
这里写图片描述
添加Line Renderer
这里写图片描述

对其进行设置,图中圈内是刀子的图片——格式为Texture
这里写图片描述
然后在其中添加脚本KnifeLine.cs,使刀子能在屏幕中显示出来
代码如下:

using UnityEngine;using System.Collections;public class KnifeLine : MonoBehaviour {    public static KnifeLine instace;//方便随时访问这个实例    //计算刀子是以什么角度切割的    public float tan;    //设置刀子"头"和"尾"的颜色    public Color startColor;    public Color nextColor;    //设置刀子的"拐点"    Vector3 startPosition;    Vector3 nextPosition;    Vector3 midPositon;    bool isNext = false;//刀子在屏幕滑行的判断    LineRenderer line; //贝塞尔曲线的定义    public int maxCount = 4;//至多有几个拐点    int nowCount = 1;//当前拐点_至少有两个拐点(0,1)    //最开始的拐点存在时间    public float allTime = 0.5f;    float time = 0;    void Awake()    {        //在Awake中初始化,方便随时访问这个实例        instace = this;     }    // Use this for initialization    void Start()    {        time = allTime;//时间初始化        line = GetComponent<LineRenderer>();//找到拥有这个脚本物体的LineRenderer        line.SetColors(startColor, nextColor);////设置刀子"头"和"尾"的颜色    }    // Update is called once per frame    void Update()    {        //如果点击屏幕,且不是切割状态        if (Input.GetMouseButton(0) && !isNext)        {            isNext = true;//准备进行滑行            //屏幕坐标与世界坐标的转换            Vector3 worldPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);            startPosition = worldPosition;            //设置贝塞尔曲线 点的多少            line.SetVertexCount(1);            //设置贝塞尔曲线 第0个点的坐标            line.SetPosition(0, startPosition);        }        //处于滑行中        else if (Input.GetMouseButton(0))        {            //切割时间递减,保证刀子轨迹存留时间正常            time -= Time.deltaTime;            //屏幕坐标与世界坐标的转换            Vector3 worldPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);            nextPosition = worldPosition;            //刀子的切割角度记录            tan = Mathf.Atan2(startPosition.y, worldPosition.y);            //将此时第"1"个点暂存(还有第"0"个点)            if (nowCount == 1)            {                midPositon = worldPosition;            }            //设置贝塞尔曲线 点的多少            line.SetVertexCount(nowCount+1);            //设置贝塞尔曲线 第nowCount个点的坐标            line.SetPosition(nowCount, nextPosition);            //如果刀子痕迹存留时间过长            if (time <= 0)            {                //当前贝塞尔曲线的点+1                nowCount++;                //如果出现新的点                if (nowCount > maxCount)                {                    //将当前点的标志设置为初始状态                    nowCount = 1;                    //将当前第"1"个点设置为新状态的第"0"个点                    line.SetPosition(0, midPositon);                }                //刀子轨迹存在时间重置                time = allTime;            }        }        //刀子切割完毕,重置状态        if (Input.GetMouseButtonUp(0))        {            nowCount = 1;            time = allTime;            isNext = false;            line.SetVertexCount(0);        }    }}

添加在KnifeLine中
运行中截图
此时,运行
这里写图片描述

接下来是水果的制作
新建立一个Sprite(改名为Apple),图集设置为”Fruit“,选择“apple02”
这里写图片描述
然后添加组件Rigidbody和Capsule Collider
这里写图片描述

添加脚本CutFruit.cs

using UnityEngine;using System.Collections;public class CutFruit : MonoBehaviour {    public static CutFruit instace;//方便随时访问这个实例    //切开后向左右两边飞的水果物体    public GameObject fruitLeft;    public GameObject fruitRight;    //暂存"切开后向左右两边飞的水果物体"    GameObject myFruitLeft;    GameObject myFruitRight;    //不同方向切,产生不同的水果"渣滓"    public GameObject cutFruitZha;    public GameObject cutFruitZhi;    //如果产生金苹果    public GameObject goldApple;    void Akake()    {        instace = this;    }    // Use this for initialization    void Start()    {    }    // Update is called once per frame    void Update()    {        //是否按下鼠标        bool isMouseDown = Input.GetMouseButton(0);        if (isMouseDown)        {            //射线,准备击打苹果            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);            RaycastHit hit;            //如果击中            if (collider.Raycast(ray, out hit, 20))            {                //产生"切开后向左右两边飞的水果物体"                myFruitLeft = (GameObject)Instantiate(fruitLeft, transform.position, Quaternion.AngleAxis(Random.Range(50, 140), Vector3.forward));                myFruitLeft.rigidbody.velocity = new Vector3(-2, 4);                myFruitRight = (GameObject)Instantiate(fruitRight, transform.position, Quaternion.AngleAxis(Random.Range(-50, -140), Vector3.forward));                myFruitRight.rigidbody.velocity = new Vector3(2, -4);                //如果产生的是"金苹果"                if (this.gameObject.name == "GoldApple(Clone)")                {                    GameObject fruit = (GameObject)Instantiate(goldApple, transform.position, Quaternion.identity);                    Destroy(fruit, 2);                }                //计算角度,产生不同的水果残渣                if (Mathf.Abs(KnifeLine.instace.tan) > 0.5 && Mathf.Abs(KnifeLine.instace.tan) < 1.5)                {                    GameObject fruit = (GameObject)Instantiate(cutFruitZhi, transform.position, Quaternion.identity);                    Destroy(fruit, 2);                }                else                {                    GameObject fruit = (GameObject)Instantiate(cutFruitZha, transform.position, Quaternion.identity);                    Destroy(fruit, 2);                }                //切开的水果,水果残渣,过一会都要"注销的"                Destroy(myFruitLeft, 2);                Destroy(myFruitRight, 2);                Destroy(this.gameObject);            }        }    }}

然后设置为”预制件”
这里写图片描述

依此类推,制作“香蕉”、“金苹果”、“梨”、“等等”

然后制作“产生水果”
有两种方法,这里选用其中简单的一种
建立一个空物体
这里写图片描述
添加脚本CreateFruit.cs

using UnityEngine;using System.Collections;public class CreateFruit : MonoBehaviour{    public static CreateFruit instace;//方便随时访问这个实例    //产生时间的设定    public float timeMin = 1;    public float timeMax = 3;    //中间时间设定    float midTime = 0;    //发射水果水平方向的力    public float xMin = 500;    public float xMax = 580;    //发射水果垂直方向的力    public float yMin = 520;    public float yMax = 600;    //存放水果的图集    public UIAtlas fruit;    //可切割脚本,没有这个脚本,水果不可切割    public CutFruit exampleApple;    void Awake()    {        //在Awake中初始化,方便随时访问这个实例        instace = this;    }    void Start()    {        //初始化水果发射时间        midTime = Random.Range(timeMin, timeMax);    }    void Update()    {         midTime -= Time.deltaTime;        //产生水果的时间到了         if (midTime <= 0)         {             //找到发射水果的地点             GameObject parentG = this.transform.gameObject;             //建立一个空UISprite,放入水果             UISprite a= NGUITools.AddSprite(parentG,fruit,"apple02");             //给水果添加缸体,设置重力             a.gameObject.AddComponent<Rigidbody>();             a.rigidbody.useGravity = true;             //给水果添加碰撞器             a.gameObject.AddComponent<CapsuleCollider>();             a.collider.isTrigger = true;             a.GetComponent<CapsuleCollider>().radius = 62.5f;             a.GetComponent<CapsuleCollider>().height = 0.65f;             //给水果一个初始的力             a.rigidbody.AddForce(Random.Range(xMin, xMax), Random.Range(yMin, yMax), 0);             //给苹果一个可切割的脚本             a.gameObject.AddComponent<CutFruit>();             CutFruit cutApple= a.GetComponent<CutFruit>();             cutApple.fruitLeft = exampleApple.fruitLeft;             cutApple.fruitRight = exampleApple.fruitRight;             cutApple.cutFruitZha = exampleApple.cutFruitZha;             cutApple.cutFruitZhi = exampleApple.cutFruitZhi;             //无论是否被切割,10秒钟后"注销             Destroy(a, 10);             //重置产生时间             midTime = Random.Range(timeMin, timeMax);         }    }}

将这个物体拖到不可观察范围(手动调试范围,图中箭头所指)

这里写图片描述

运行程序:
经过切割后留下的一半苹果和苹果残渣
这里写图片描述

这只是添加了“苹果”,代码经过简单修改后,即可仿制一个简单的”切水果”游戏。


欢迎关注我的微信个人订阅号
这里写图片描述
每天多学一点0.0

4 0
原创粉丝点击