zoukankan      html  css  js  c++  java
  • Unity3D笔记 愤怒的小鸟<六> 弹弓发射小鸟

    要实现的目标

      实现个性化的鼠标
      实现弹弓
      选择小鸟、拉升弹弓、发射小鸟
      弹弓橡皮筋
      声音

    1、实现个性化鼠标

     

    效果

    2、添加弹弓

    建立两个材质

    创建一个空GameObject 把两个shoot拖进来统一管理

    3、建一个空GameObject 弹弓slingShot

      3.1把

      

      3.2创建一个Sphere碰撞体

      调整好radius=0.2大小

    4、拉伸弹弓、发射小鸟代码

    using UnityEngine;
    using System.Collections;
    
    public class slingShot : MonoBehaviour
    {
    
        /// <summary>
        /// 小鸟
        /// </summary>
        public GameObject bird;
        /// <summary>
        /// 弹弓拉伸的声音
        /// </summary>
        public AudioClip slingShotSound;
        /// <summary>
        /// 飞行声音
        /// </summary>
        public AudioClip flyingSound;
        /// <summary>
        /// 弹弓橡皮筋颜色
        /// </summary>
        public Color myColor;
        /// <summary>
        /// 是否按下鼠标
        /// </summary>
        private bool isClick = false;
        /// <summary>
        /// 发射出去的小鸟
        /// </summary>
        private GameObject shot;
    
        /// <summary>
        /// 拉伸弹弓小鸟的位置
        /// </summary>
        private Vector3 lastKnowPosition;
    
        private Vector3 direction;
        /// <summary>
        /// [ˈmægnɪtju:d] n. 巨大,广大;重大,重要;量级;(地震)级数 
        /// </summary>
        private float magnitude;
    
        /// <summary>
        /// 小鸟运动的轨迹线
        /// </summary>
        public static bool isDrawing = false;
        /// <summary>
        /// 小鸟发出去后下一个小鸟是否上弹弓
        /// </summary>
        public static bool isJump = false;
        /// <summary>
        /// 飞出去的小鸟
        /// </summary>
        public static GameObject myBird;
        /// <summary>
        /// 发射的是那只小鸟
        /// </summary>
        public static int birdNumber;
        /// <summary>
        /// 画弹弓的橡皮筋
        /// </summary>
        private LineRenderer lineRenderer;
    
        private int index = 0;
        private Vector3 position;
    
        // Use this for initialization
        void Start()
        {
            birdNumber = -1;
            lineRenderer = gameObject.AddComponent<LineRenderer>();//添加对象 画两条线
            lineRenderer.material.color = myColor;
            lineRenderer.SetWidth(0.1f, 0.1f);//设置宽度
            lineRenderer.SetVertexCount(3);//橡皮筋两个点+小鸟一个点 ['vɜ:teks] n. 最高点;顶点;<数>(三角形、圆锥体等与底相对的)顶;(三角形、多边形等的)角的顶点
        }
    
        // Update is called once per frame
        void Update()
        {
            bool isMouseDown = Input.GetMouseButton(0);
            if (!isClick)//拖放小鸟 没有点击
            {
                if (isMouseDown)
                {
                    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//把鼠标的点定义一个射线
                    RaycastHit hit;//光线投射碰撞
                    if (collider.Raycast(ray, out hit, 10.0f))//光线投射 选择小鸟 [distance光线的长度。]
                    {
                        isClick = true;
                        if (birdNumber <= 1)
                        {
                            //Instantiate()克隆原始物体,位置设置在position,设置旋转在rotation,返回的是克隆后的物体
                            //Quaternion.identity:返回恒等式旋转(只读)。这个四元数对于“无旋转”:这个物体完全对齐于世界或父轴。
                            shot = Instantiate(bird, transform.position, Quaternion.identity) as GameObject;//动态的生成被发射的小鸟  [ɪns'tænʃɪeɪt]  实例化 
                            //Physics.IgnoreCollision 忽略碰撞:使碰撞体1和碰撞体2的碰撞侦测无效。
                            Physics.IgnoreCollision(shot.collider, GetComponent<Collider>()); //忽略小鸟碰撞体
                            shot.rigidbody.isKinematic = true;//运动属性
                            myBird = GameObject.FindWithTag("bird0");//拉伸位置的Bird
                            myBird.active = false;//隐藏
                        }
                    }
                }
            }
            else if (isMouseDown)
            {
                var lastDirection = direction;
                lastKnowPosition = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0.8f));
                direction = transform.position - lastKnowPosition;
                direction.Normalize();//规范化当规范化时,一个向量保持相同的方向,但它的长度为1.0。
                magnitude = Mathf.Min(Vector3.Distance(transform.position, lastKnowPosition), 2.5f);//最小值:橡皮筋拉伸距离;返回两个或更多值中最小的值。
                shot.transform.position = transform.position + direction * (-magnitude);
                lineRenderer.enabled = true;//LineRenderer :线渲染器 如果启用,使被渲染的物体可见
                //三点:小鸟+弹弓两点
                lineRenderer.SetPosition(0, new Vector3(-5.1f, 2.2f, 0.1f));//弹弓橡皮筋点
                lineRenderer.SetPosition(1, shot.transform.position);//小鸟点
                lineRenderer.SetPosition(2, new Vector3(-5.6f, 1.2f, -0.1f));//弹弓橡皮筋点
                if (direction != lastDirection)
                {
                    if (!audio.isPlaying)
                    {
                        PlaySound(slingShotSound);
                    }   
                    
                }
            }
            else//发射
            {
                birdNumber++;
                if (birdNumber<=2)
                {
                    GameObject birdObject2 = GameObject.FindWithTag("birdClone");//实例化的小鸟也就是飞出去的小鸟
                    if (birdObject2!=null)
                    {
                        Destroy(birdObject2, 1.0f);////加载物体1秒后销毁游戏物体
                    }
                    lineRenderer.enabled = false;//不显示橡皮筋了
                    shot.collider.isTrigger = false;
                    shot.rigidbody.isKinematic = false;// 是否动力学:[ˌkɪnɪ'mætɪk] adj. 运动学的,运动学上的
                    shot.rigidbody.velocity = direction * 7.0f * magnitude;//速度
                    shot.rigidbody.useGravity = true;
                    if (audio.isPlaying)
                    {
                        audio.Stop();
                    }
                    PlaySound(flyingSound); 
                    shot.tag = "birdClone";
                    isClick = false;
                }
            }
        }
    
    
    
        /// <summary>
        /// 小鸟拉伸发生声音
        /// </summary>
        /// <param name="soundName"></param>
        /// <returns></returns>
        public  void PlaySound(AudioClip soundName)
        {
            if (!audio.isPlaying)
            {
                audio.clip = soundName;
                audio.Play(); 
                new WaitForSeconds(audio.clip.length);
            }   
        }
    }

    5、最终效果

     


    作者:PEPE
    出处:http://pepe.cnblogs.com/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Arthas 使用的各类方式
    1小时打造HaaS版小小蛮驴智能车
    Serverless 场景下 Pod 创建效率优化
    .net程序员的盲点(八):泛型
    altas(ajax)控件(五):日历控件Calendar
    altas(ajax)控件(六):CascadingDropDown 联动选择的下拉框
    altas(ajax)控件(二):悬浮面板控件AlwaysVisibleControl
    altas(ajax)控件(八):ConfirmButton确认对话框
    altas(ajax)控件(九):可拖动面板DragPanel
    altas(ajax)控件(三):动画制作控件AnimationExtender
  • 原文地址:https://www.cnblogs.com/PEPE/p/3553281.html
Copyright © 2011-2022 走看看