zoukankan      html  css  js  c++  java
  • Unity3D游戏开发之《愤怒的小鸟》弹弓实现技能培训

           今天我们来做一个高端大气上档次的东西。我相信大家都玩过一款叫做《愤怒的小鸟》的游戏,这款游戏之所以能够受到玩家的喜爱,是因为这是一款物理游戏,在游戏中处处充满了物理。我们熟悉的抛物线、引力等物理元素都在这款游戏中得到了体现。那么《愤怒的小鸟》这款游戏使用的正是Unity引擎,所以我们在游戏中看到了各种各种有趣的物理现象。那么,我们今天呢,就以《愤怒的小鸟》游戏中的小鸟发射器——弹弓为例,来讲述在Unity中如何实现弹性效果。

       下面我们开始今天的Unity3D游戏开发技能培训。 我们学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D、3D小规模游戏及网页游戏开发。

           首先,我们来引入一个新的概念——LineRenderer。在Unity3D中LineRenderer被称为线性渲染器。通过这个组件,我们可以做一些比较有创意的东西,比如在游戏中绘制线段、制作激光特效、武器拖尾效果等。那么今天呢,我们是用LineRenderer来构造弹弓两边的绳子,这个绳子是具有弹性的,在受力结束后可以恢复到原来的状态。我们首先创建一个如下图的简单场景:

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

    当用户按下鼠标左键并移动鼠标的时候,小球和绳子都将跟着移动,当松开鼠标左键的时候,小球以一定的角度和一定的力发射出去。我们今天着重来讲绳子的实现。首先我们创建一个空的GameObject将坐标值设为原点,命名为RopeL。接下来我们通过Component->Effects->Line Renderer为添加一个线性渲染器组件。如图:

          我们设定好上述参数后,就可以开始编写脚本了,这里两根绳子是对称的:

    [csharp] view plaincopyprint?
     
    1. using UnityEngine;  
    2. using System.Collections;  
    3.   
    4. public class Ball : MonoBehaviour {  
    5.   
    6.     //鼠标位置  
    7.     private Vector3 MousePos;  
    8.   
    9.     //左侧LineRenderer  
    10.     private LineRenderer LineL;  
    11.     //右侧LineRenderer  
    12.     private LineRenderer LineR;  
    13.       
    14.     void Start ()  
    15.     {  
    16.         //获取LineRenderer  
    17.         LineL=GameObject.Find("Shootor").transform.FindChild("RopeL").  
    18.             transform.GetComponent<LineRenderer>();  
    19.         LineR=GameObject.Find("Shootor").transform.FindChild("RopeR").  
    20.             transform.GetComponent<LineRenderer>();  
    21.     }  
    22.   
    23.     void Update ()   
    24.     {  
    25.         if(Input.GetMouseButton(0))  
    26.         {  
    27.            //获取鼠标位置  
    28.             MousePos=Camera.main.ScreenToViewportPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,-2F));  
    29.            //设置小球的位置  
    30.            transform.position=MousePos;  
    31.            //重新设置LineRenderer的位置  
    32.            LineL.SetPosition(0,new Vector3(MousePos.x,MousePos.y,MousePos.z-0.5F));  
    33.            LineR.SetPosition(0,new Vector3(MousePos.x,MousePos.y,MousePos.z-0.5F));  
    34.         }  
    35.         if(Input.GetMouseButtonUp(0))  
    36.         {  
    37.             //获取鼠标位置  
    38.             MousePos=Camera.main.ScreenToViewportPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,-2F));  
    39.             //设置小球的位置  
    40.             transform.position=MousePos;  
    41.             //重新设置LineRenderer的位置  
    42.             LineL.SetPosition(0,new Vector3(MousePos.x,MousePos.y,MousePos.z-0.5F));  
    43.             LineR.SetPosition(0,new Vector3(MousePos.x,MousePos.y,MousePos.z-0.5F));  
    44.   
    45.             //计算小球合力方向  
    46.             Vector3 Vec3L=new Vector3(-2F-MousePos.x,1.8F-MousePos.y,0F-MousePos.z);  
    47.             Vector3 Vec3R=new Vector3(2F-MousePos.x,1.8F-MousePos.y,0F-MousePos.z);  
    48.             Vector3 Dir=(Vec3L+Vec3R).normalized;  
    49.             //获取刚体结构  
    50.             transform.GetComponent<Rigidbody>().useGravity=true;  
    51.             transform.GetComponent<Rigidbody>().AddForce(Dir*10F,ForceMode.Impulse);  
    52.             //恢复LineRenderer  
    53.             LineL.SetPosition(0,new Vector3(0F,1.8F,0F));  
    54.             LineR.SetPosition(0,new Vector3(0F,1.8F,0F));  
    55.         }  
    56.     }   
    57. }  

            我们给小球加上刚体后,绑定这段脚本就可以了。我们需要注意的问题有:

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

    更多精彩请到http://www.gopedu.com/

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

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

           

  • 相关阅读:
    Linux-Rsync命令参数详解
    Linux-iptables(2)
    Linux-iptables
    Linux-awk command
    Linux-sed command
    Linux-tomcat
    C#调用默认浏览器打开网页的几种方法
    个人记录用
    .NET中的Request
    sql标量值函数,将汉字转化为拼音,无音标
  • 原文地址:https://www.cnblogs.com/Unity3Dqishituan/p/3989093.html
Copyright © 2011-2022 走看看