[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群:375151422       cocos2dx QQ群:280818155

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

 

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

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

时间: 2024-08-30 18:26:33

[Unity3d]水果忍者-切水果功能的相关文章

玩家模拟iPhone最火游戏《水果忍者》真人版

水果忍者Fruit Ninja是一款简单的休闲游戏,目的只有一个--砍水果!屏幕上会不断跳出各种水果--西瓜,凤梨,猕猴桃,草莓,蓝莓,香蕉,苹果等等--在它们掉落之前要快速的全部砍掉!千万别砍到炸弹!不然就over了. 这么有趣的游戏,老外怎么可能不恶搞呢?请看下面两段视频,真人版忍者切水果,第一段的瘦子明显比较高段,第二段的胖子结尾模仿阿布罗狄口叼鲜花,耍浪漫-- 瘦子版: 胖子版: 更多资讯请关注多玩游戏网. (编辑/徐明明)

PS创意合成切猕猴桃的水果忍者海报

  这篇PS创意合成切猕猴桃的水果忍者海报教程是我刚刚学习过的一个合成教程,最近这段时间挺流行海报合成的教程的,看了不少,这个教程来自"达人小鬼 "原创,挺不错的,推荐过来和脚本之家的朋友们一起分享学习了,我们先来看看最终的效果图吧: 以上就是PS创意合成切猕猴桃的水果忍者海报教程,是不是很不错啊,大家可以学习这篇教程思路,发挥自己的想象力,合成更有创意的画面! 分类: PS入门教程

[unity3d]水果忍者-界面搭建

今天开始用Unity3D做一下水果忍者的游戏,Keep study very day! 效果图:                                                                                                                  实现步骤:                                                                                  

愤怒有理由 水果忍者版切小鸟游戏试玩

无论是水果忍者还是愤怒的小鸟,都已经成为手机平台上响当当的经典游戏,如果将这二者结合到一起会有什么效果.近日一款名为切小鸟的游戏(Cut the Birds)成为了App Store上的新关注点,究竟是经典的延续还是山寨搞怪,带着这种疑问,笔者也下载了这款游戏进行体验.游戏启动画面各种小鸟一个都不少尽管更换为以蓝天白云为背景,但我们仍然能够看到水果忍者的影子.这是一款名副其实的切小鸟游戏,当小鸟从屏幕下方飞出时,玩家要及时将逐渐变大的小鸟消灭掉,否则小鸟越变越大 就会爆炸并产生碎屏幕的效果.熟悉

水果忍者系列新作《水果忍者大战彩虹糖》发布

风靡全球的街机游戏<水果忍者(Fruit Ninja)>朋友们已经再熟悉不过,该游戏至上架以来也已经有3年的时间了,虽然期间开发商 Halfbrick Studios 给朋友们带来了不少好玩的游戏,不过水果忍者系列游戏却没有大的变化. 游戏名称<水果忍者大战彩虹糖>价格:免费点击下载发布日期:2013年6月25日大小:33.5 MB而就在前不久,开发商 Halfbrick Studios推出了水果忍者系列的新作<水果忍者大战彩虹糖(Fruit Ninja vs Skittle

最潮4款iPhone游戏:新水果忍者发泄玩家情绪

理财周报记者 宋韵芸/文 要潮爆iPhone单靠植物大战僵尸已经被达人们大叫"out"了.风靡三大手机系统的新版水果忍者发泄玩家情绪,"愤怒的小鸟"和"最终幻想"合体成"鱿鱼",童话感十足.最新最潮的4款iPhone游戏售价普遍都在99美分,还在等什么?准备迎接挑战吧! 新版水果忍者(Fruit Ninja) 风靡三大手机系统 测评 5星 难度 3星 售价:iPhone/iPod Touch版99美分,iPad版1.99美元

手机“切水果”两个月女孩患上鼠标手

本报讯(记者 叶惠娟 通讯员 肖瑶)自从各种智能手机流行后,手机游戏也开始风靡,但其中也暗藏杀机.昨日,酷爱玩手机游戏"水果忍者"的陈巧到西南医院康复科求助:因为玩了两个多月的游戏"切水果",她的食指不能动了! 据了解,陈巧家住江北五里店,今年刚考上大学.为了奖励她考上了名牌大学,父母送了她一个iPhone4手机.暑假期间,她给自己的手机下载了很多游戏,尤其喜欢耍一个叫"切水果"的游戏. "我每天都打,一玩就不能停止,有时一天会连续玩十

安卓平台免费版水果忍者更新 增加全新刀片和背景

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   < 水果忍者(Fruit Ninja)>已经很久没什么大的更新了,作为 一款老牌知名游戏,难道生命已经走向尽头了吗?开发商Halfbrick Studios似乎并不这么想,近日水果忍者在安卓平台对其免费版进行了更新,加入了海量的更新内容,其中为平板装置增加本地 多人游戏支持(兼容 7 寸及以上平板电脑,游戏自动检测符合条件的设备.).全 新的刀片和背

水果忍者名列App Store畅销排行榜前十位

这款让玩家化身为忍者.畅快地切开水果的简单游戏目前已名列App Store畅销排行榜前十位,在全球实现了超过7500万的下载量 文|上海国资记者 刘昌荣 也许你没有听过说澳大利亚的Halfbrick公司,但一定知道这家公司的主打游戏--<水果忍者>(Fruit Ninja).这款让玩家化身为忍者.畅快地切开水果的游戏目前已名列App Store畅销排行榜前十位,几乎成了iPhone.iPad用户必装的游戏. 实际上,Halfbrick Studios只是澳大利亚布里斯班的一个小型游戏工作室,共