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