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

Posted XML火柴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用NGUI模仿制作“切水果”相关的知识,希望对你有一定的参考价值。

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

首先,载入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

以上是关于使用NGUI模仿制作“切水果”的主要内容,如果未能解决你的问题,请参考以下文章

基于HTML5和JS实现的切水果游戏

codevs 1299 切水果 线段树

[codevs1299] 切水果

Codevs 1299 切水果 水一发

NGUI制作摇杆

Pygame实战风靡全球的切水果游戏升级版“水果忍者”上线啦!你敢来PK嘛?!