[Unity3d]水果忍者-切水果功能

简介:

继续今天的切水果游戏之切苹果的实现,主要功能就是,有一个苹果放在场景中,然后通过手滑过苹果,就将苹果切成两半,从原理上分析,就是制作两张贴图,分别表示分开的两半苹果,然后在当前位置出现,并且给这两半苹果加上刚体属性,然后分别给这两半苹果加上一个相反的力使其自由落体!

效果图                                                                                                                         




实现步骤                                                                                                                     

1.原理分析

就是通过摄像机发出一条射线碰撞到具备碰撞器的苹果,也就是说要给苹果添加上BoxCollider属性,然后苹果检测到碰撞,然后在当前位置出现两个具有刚体(物理)属性的半边苹果,方向是随机出现,然后随机给添加上向量力,使得这两个半个苹果做自由下落。

2.半边苹果的制作

创建一个材质球,然后给材质球赋予贴图属性,就像下图所示的红色区域的图片

然后添加上BoxCollider和Rigidbody两个属性,勾选下图所示的红色区域中的选项



IsTrigger:勾选上的时候,触发器不会碰撞刚体,但当刚体退出或进入触发器的时候,将会发送OnTriggerEnter,OnTriggerExit和OnTriggerStay消息。
UseGravity:字面解释就是使用重力
Constraints:是约定冻结旋转和移动,这里冻结了Z轴的移动,也就是不允许苹果前后位置的移动,冻结了X,Y轴方向的旋转,也就是不能让苹果前后翻转或者左右旋转。
然后将这半个苹果做成prefeb,删除掉场景中的半个苹果的GameObject。

3.完整苹果的属性的设置



主要是让这个主苹果具备BoxCollider属性,使其能够让射线碰撞到,主要要加上AudioSource不然会报错。

4.源代码

该两个代码附加在Apple00上,也就是主苹果上。

knifeRay01    //如果射线碰撞到苹果,就显示出两半苹果,并且给添加两个方向相反的方向力
using UnityEngine; using System.Collections;  public class knifeRay01 : MonoBehaviour {      //选择颜色     //    public Color mycolor;      public GameObject myRay;  //这个是刀光的prefab      public AudioClip knifeSound;      public bool isHit = false;     public Vector3 rayPosition;      public bool isRay = false;      public GameObject firstFruit;     public GameObject secondFruit;      private GameObject myFirstFruit;     private GameObject mySecondFruit;       private Vector3 firstPosition;     private Vector3 secondPosition;     // private Vector3 middlePosition;      private bool isClicked = false;      private LineRenderer lineRenderer;      private GameObject rayGameObject;      private float angle;      // Use this for initialization     //	void Start () {     //        lineRenderer = gameObject.AddComponent<LineRenderer>();//添加一个划线的组件     //        //设置颜色和宽度     //        lineRenderer.material.color = mycolor;     //        lineRenderer.SetWidth(0.1f, 0.1f);     //	}      // Update is called once per frame     void Update()     {          bool isMouseDown = Input.GetMouseButton(0);//判断鼠标是否左击           if (isHit)         {             if (isMouseDown && !isClicked)             {                 //屏幕坐标转化成空间坐标                 firstPosition = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 1));                  //            lineRenderer.SetVertexCount(1);                 //                 //            lineRenderer.enabled = true;                 //            lineRenderer.SetPosition(0,firstPosition);                  isClicked = true;             }              else if (isMouseDown)             {                 secondPosition = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 1));                  //            lineRenderer.SetVertexCount(2);                 //                 //            lineRenderer.SetPosition(1, secondPosition);             }              //鼠标提起             else if (Input.GetMouseButtonUp(0))             {                 isRay = true;                    secondPosition = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 1));                  if (secondPosition.x != firstPosition.x)                 {                     angle = Mathf.Atan((secondPosition.y - firstPosition.y) / (secondPosition.x - firstPosition.x));                     print("角度:" + angle * 180 / Mathf.PI);                 }                 else                 {                     angle = 0;                 }                  //创建划痕,这里旋转的是幅度                 rayGameObject = Instantiate(myRay, rayPosition, Quaternion.AngleAxis(angle * 180 / Mathf.PI, Vector3.forward)) as GameObject;                 //两个被切的水果                 myFirstFruit = Instantiate(firstFruit, transform.position, Quaternion.AngleAxis(Random.Range(50, 180) * 180 / Mathf.PI, Vector3.forward)) as GameObject;                 mySecondFruit = Instantiate(firstFruit, transform.position, Quaternion.AngleAxis(Random.Range(80, 150) * 180 / Mathf.PI, Vector3.forward)) as GameObject;                  //				myFirstFruit.rigidbody.velocity = new Vector2(Mathf.Sin(angle)*10,-Mathf.Cos(angle)*10);                 //				mySecondFruit.rigidbody.velocity = new Vector2(Mathf.Sin(angle)*10,Mathf.Cos(angle)*10);                  //这里方向是随机出现的,其实正确的应该是计算切线的角度来计算苹果切开两半的一个飞溅的方向                 if (Random.Range(1, 10) > 5)                 {						//给加一个力,方向相反                     myFirstFruit.rigidbody.velocity = new Vector2(5, 10);                     mySecondFruit.rigidbody.velocity = new Vector2(-8, -10);                     myFirstFruit.rigidbody.velocity = new Vector2(0, 10);                     mySecondFruit.rigidbody.velocity = new Vector2(0, -10);                 }                 else                 {                     myFirstFruit.rigidbody.velocity = new Vector2(-5, 10);                     mySecondFruit.rigidbody.velocity = new Vector2(8, -10);                 }                  Physics.gravity = new Vector3(0, -20, 0);                  Destroy(myFirstFruit, 2.0f);                 Destroy(mySecondFruit, 2.0f);                  if (audio.isPlaying)                 {                     audio.Stop();                 }                 else                 {                     PlaySound(knifeSound);                     print("播放声音");                 }                  Destroy(rayGameObject, 0.2f);//立马释放刀光                  //            lineRenderer.SetVertexCount(2);                 //                 //            lineRenderer.SetPosition(1, secondPosition);                   isClicked = false;                  isHit = false;                  //middlePosition = (firstPosition+secondPosition)/2;                   Destroy(rayGameObject, 1.0f);//一秒钟就去掉             }         }          else         {             isRay = false;         }     }      void PlaySound(AudioClip soundName)     {         if (!audio.isPlaying)         {             AudioSource.PlayClipAtPoint(soundName, new Vector3(0, 0, -10));//在指定位置播放	         }     } } 

hitByKnife//用于判断射线是否碰撞到苹果
using UnityEngine; using System.Collections;  public class hitByKnife : MonoBehaviour {      private bool isClicked = false;      // Use this for initialization     void Start()     {      }      // Update is called once per frame     void Update()     {         bool isMouseDown = Input.GetMouseButton(0);//判断鼠标是否左击         if (!isClicked)         {             if (isMouseDown)             {                 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);                 RaycastHit hit;                 if (collider.Raycast(ray, out hit, 1000f))                 {                     transform.GetComponent<knifeRay01>().isHit = true;                     transform.GetComponent<knifeRay01>().rayPosition = hit.transform.position;                 }             }         }     } } 

==================== 迂者 丁小未 CSDN博客专栏=================

MyBlog:http://blog.csdn.net/dingxiaowei2013             MyQQ:1213250243

Unity QQ群:858550         cocos2dx QQ群:280818155

====================== 相互学习,共同进步 ===================

 

转载请注明出处:http://blog.csdn.net/dingxiaowei2013/article/details/18626365

欢迎关注我的微博:http://weibo.com/u/2590571922

相关文章
|
3月前
|
定位技术 C# 图形学
从零开始的unity3d入门教程(二)----基本功能讲解
这是一篇Unity3D入门教程,详细介绍了Unity界面操作、游戏物体创建修改、场景搭建、玩家控制、音效添加以及游戏测试和导出的全过程。
从零开始的unity3d入门教程(二)----基本功能讲解
|
3月前
|
图形学
小功能⭐️Unity UnityEvent实现代码的选择
小功能⭐️Unity UnityEvent实现代码的选择
|
3月前
|
机器学习/深度学习 图形学 Windows
小功能⭐️unity3d KeyCode各键值说明
小功能⭐️unity3d KeyCode各键值说明
|
3月前
|
图形学 Android开发
小功能⭐️Unity调用Android常用事件
小功能⭐️Unity调用Android常用事件
|
2月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
165 0
|
3月前
|
数据可视化 图形学
小功能⭐️Unity2018 Shader Graph——全息影像、物体消融
小功能⭐️Unity2018 Shader Graph——全息影像、物体消融
|
3月前
|
图形学
小功能⭐️Unity中利用材质自发光实现物体闪烁效果
小功能⭐️Unity中利用材质自发光实现物体闪烁效果
|
3月前
|
图形学
小功能⭐️Unity Button按钮实现鼠标移入移出触发相应事件
小功能⭐️Unity Button按钮实现鼠标移入移出触发相应事件
|
3月前
|
图形学
小功能⭐️Unity获取点击到的UI
小功能⭐️Unity获取点击到的UI