使用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
- 使用NGUI模仿制作“切水果”
- NGUI使用图片制作文字
- 简单的切水果游戏制作
- 使用BMFont制作NGUI用的中文字体
- 使用插件NGUI制作小地图
- Unity3D使用NGUI制作小地图
- Unity3D使用NGUI制作小地图
- 【unity】使用NGUI制作滚动列表
- Unity3d 使用Texturepacker制作NGUI图集
- 使用BmFont制作NGUI的图片字体
- 使用NGUI制作简易的老虎机
- NGUI使用Atlas制作图集
- 使用cocos2d制作【水果忍者】的类似游戏part1
- NGUI使用教程(3) 使用外部图片制作Atlas(图集)
- UNITY3D使用NGUI制作自适应UI的总结
- unity 3d中使用BMFont制作NGUI清晰字体
- unity NGUI中使用bmfont制作的字体图集
- unity 3d中使用BMFont制作NGUI清晰字体
- IntelliJ IDEA 12 + git
- Ubuntu终端Terminal常用快捷键
- 储存班长信息类的学生类
- FragmentpagerAdapter和FragmentStatePagerAdapter的区别
- HDU 2112 HDU Today
- 使用NGUI模仿制作“切水果”
- 百度之星2016B题java大数
- Math.cos()和Math.sin()和Math.atan()
- C++primer知识点(四)
- 217. Contains Duplicate [easy] (Python)
- 第24讲 项目2 油量监控
- AsyncTask源码解析
- C++primer知识点(五)(终结C++primer)
- Windows SQL Server 2008 R2安装问题处理