[Unity3D]Unity3D游戏开发之《愤慨的小鸟》弹弓实现

摘要:
我相信每个人都玩过一个叫做“愤怒的小鸟”的游戏。这款游戏之所以能受到玩家的喜爱,是因为它是一款物理游戏,到处都充满了物理。所以《愤怒的小鸟》游戏使用了Unity引擎,所以我们在游戏中看到了各种有趣的物理现象。所以今天,让我们以《愤怒的小鸟》游戏中的鸟发射器弹射器为例,来描述如何在Unity中实现弹性效果。LineRenderer在Unity3D中称为线性渲染器。

        各位朋友,大家晚上好, 我是秦元培。欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei。今天我们来做一个高端大气上档次的东西。

我相信大家都玩过一款叫做《愤慨的小鸟》的游戏,这款游戏之所以可以受到玩家的喜爱,是由于这是一款物理游戏,在游戏中处处充满了物理。我们熟悉的抛物线、引力等物理元素都在这款游戏中得到了体现。

那么《愤慨的小鸟》这款游戏使用的正是Unity引擎,所以我们在游戏中看到了各种各种有趣的物理现象。

那么,我们今天呢,就以《愤慨的小鸟》游戏中的小鸟发射器——弹弓为例,来讲述在Unity中怎样实现弹性效果。

        首先,我们来引入一个新的概念——LineRenderer。

在Unity3D中LineRenderer被称为线性渲染器。通过这个组件,我们能够做一些比較有创意的东西。比方在游戏中绘制线段、制作激光特效、武器拖尾效果等。

那么今天呢,我们是用LineRenderer来构造弹弓两边的绳子,这个绳子是具有弹性的,在受力结束后能够恢复到原来的状态。我们首先创建一个例如以下图的简单场景:

[Unity3D]Unity3D游戏开发之《愤慨的小鸟》弹弓实现第1张

       在上面的场景中,两边的柱子作为固定绳子的物体。小球在两根绳子中间。我们希望实现的是:

当用户按下鼠标左键并移动鼠标的时候,小球和绳子都将跟着移动,当松开鼠标左键的时候,小球以一定的角度和一定的力发射出去。我们今天着重来讲绳子的实现。首先我们创建一个空的GameObject将坐标值设为原点,命名为RopeL。

接下来我们通过Component->Effects->Line Renderer为加入一个线性渲染器组件。如图:

[Unity3D]Unity3D游戏开发之《愤慨的小鸟》弹弓实现第2张

      我们设定好上述參数后,就能够開始编写脚本了,这里两根绳子是对称的:

using UnityEngine;
using System.Collections;

public class Ball : MonoBehaviour {

	//鼠标位置
	private Vector3 MousePos;

	//左側LineRenderer
	private LineRenderer LineL;
	//右側LineRenderer
	private LineRenderer LineR;
	
	void Start ()
	{
		//获取LineRenderer
		LineL=GameObject.Find("Shootor").transform.FindChild("RopeL").
			transform.GetComponent<LineRenderer>();
		LineR=GameObject.Find("Shootor").transform.FindChild("RopeR").
			transform.GetComponent<LineRenderer>();
	}

	void Update () 
	{
		if(Input.GetMouseButton(0))
		{
		   //获取鼠标位置
			MousePos=Camera.main.ScreenToViewportPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,-2F));
		   //设置小球的位置
		   transform.position=MousePos;
		   //又一次设置LineRenderer的位置
		   LineL.SetPosition(0,new Vector3(MousePos.x,MousePos.y,MousePos.z-0.5F));
		   LineR.SetPosition(0,new Vector3(MousePos.x,MousePos.y,MousePos.z-0.5F));
	    }
		if(Input.GetMouseButtonUp(0))
		{
			//获取鼠标位置
			MousePos=Camera.main.ScreenToViewportPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,-2F));
			//设置小球的位置
			transform.position=MousePos;
			//又一次设置LineRenderer的位置
			LineL.SetPosition(0,new Vector3(MousePos.x,MousePos.y,MousePos.z-0.5F));
			LineR.SetPosition(0,new Vector3(MousePos.x,MousePos.y,MousePos.z-0.5F));

			//计算小球合力方向
			Vector3 Vec3L=new Vector3(-2F-MousePos.x,1.8F-MousePos.y,0F-MousePos.z);
			Vector3 Vec3R=new Vector3(2F-MousePos.x,1.8F-MousePos.y,0F-MousePos.z);
			Vector3 Dir=(Vec3L+Vec3R).normalized;
			//获取刚体结构
			transform.GetComponent<Rigidbody>().useGravity=true;
			transform.GetComponent<Rigidbody>().AddForce(Dir*10F,ForceMode.Impulse);
			//恢复LineRenderer
			LineL.SetPosition(0,new Vector3(0F,1.8F,0F));
			LineR.SetPosition(0,new Vector3(0F,1.8F,0F));
		}
	} 
}
        我们给小球加上刚体后。绑定这段脚本就能够了。我们须要注意的问题有:

        1、这里的力是给定的大小,我们能够依据绳子被拉长的距离使用一个弹性系数来计算力的大小。

        2、计算合力的方向时,我们首先计算两边绳子的向量值。然后将这两个向量想加就可以得到我们的合力方向。

        好了。我们一起来看今天的效果演示吧!

[Unity3D]Unity3D游戏开发之《愤慨的小鸟》弹弓实现第3张

        今天被宿舍里玩游戏的这些人搞得心情非常不好,也许注定我们不是同一个世界的人吧,大学三年。渐渐地对专业、班级没有了归属感,我宁愿在我的小圈子里努力做好自己的事情。二十几岁的人,每天就指望着游戏来满足你的成就感,这种生活我实在不喜欢。

人还是应该努力一点的。不为什么,就为了我们父母、亲人、爱人。大学里知道自己喜欢什么。能够做什么比上课学到了什么更重要。

你不努力,永远有别人比你更努力。生活总得有点向往吧。

唉,算了,发什么牢骚啊,做好自己即可了。该睡觉了,大家晚安吧!

   每日箴言:成长,便是接受一个不完美的自己和一个不理想的自己,也接受这个世界的不完美和不理想。

——张小娴


[Unity3D]Unity3D游戏开发之《愤慨的小鸟》弹弓实现第4张

    喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei。
    转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/24941939


免责声明:文章转载自《[Unity3D]Unity3D游戏开发之《愤慨的小鸟》弹弓实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android 应用程序之间内容分享详解(一)Linux程序包管理.md下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Unity3D Shader入门指南(一)

转自:http://unity3d.9tech.cn/news/2013/1202/39031.html 自己使用unity3d也 有一段时间了,但是很多时候是流于表面,更多地是把这个引擎简单地用作脚本控制,而对更深入一些的层次几乎没有了解。虽然说Unity引擎设计的初衷就是 创建简单的不需要开发者操心的谁都能用的3D引擎,但是只是肤浅的使用,可能是无法...

Unity3D入门(二):碰撞检測

碰撞器由来 1.系统默认会给每一个对象(GameObject)加入一个碰撞组件(ColliderComponent),一些背景对象则能够取消该组件。 2.在unity3d中,能检測碰撞发生的方式有两种,一种是利用碰撞器,还有一种则是利用触发器。这两种方式的应用很广泛。为了完整的了解这两种方式,我们必须理解下面概念: (一)碰撞器是一群组件,它包括了非常多...

Unity3D 原生Android结合UnityPlayerActivity开发遇到的问题

需求是原生Android 的Activity启动UnityPlayerActivity,按Back键后返回原来的Activity 1、在AndroidManifest.xml中的UnityPlayerActivity标签中加入 android:process=":unityplayer" 2、在C#代码里可以直接掉Application.Quit()...

[vuforia][unity3d]资源链接

http://bbs.csdn.net/topics/390787189 CSDN论坛中 “Qualcomm Vuforia(AR虚拟现实)开发” 主题资源下载http://bbs.csdn.net/forums/qualcomm CSDN论坛http://bbs.9ria.com/thread-417491-1-1.html unity获取对象...

Unity3D-制作火焰效果

1.插件的准备 随着官网上的迭代更新,连下载按钮都找了好久,今天制作的火焰效果要依赖一个插件,LowPoly Environment Pack 输入网址unity3d.com在Assert Store上面搜索这个【LowPoly Environment Pack】插件,点击 Open in Unity ,此步将以exe方式选择链接打开,在打开的view里才...

Unity3D写雷电游戏(二)

通过上一篇那些资料的学习,现在假定你能比较熟练的操作unity3D了。 本人也是Unity3D的初学者,这边记录一下我的游戏制作经过,希望对别人有所帮助吧,欢迎大家一起讨论。 一、搭建游戏的框架。 一般的游戏都可以分为四个场景: 1.开始界面 2.游戏场景 3.暂停界面 4.结束界面 开始界面,就是存放开始菜单的地方了,游戏场景就是游戏的主场景,游戏的主要...