使用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模仿制作“切水果”的主要内容,如果未能解决你的问题,请参考以下文章