Unity3D游戏开发之《愤怒的小鸟》弹弓怎么实现

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

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

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));

}

}

}