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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类:
Unity3D
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述