008-Controller_UsingAGrabbedObject 操作抓取的物体
展示了抓取之后再使用对象的功能,具体操作GripPress按下抓取物体(VRTK_InteractGrab),然后TriggerPress使用物体开火射击或旋转(VRTK_InteractUse)。即场景中极简易的枪抓取后,再按扳机开火。
首先在左右手柄上添加VRTK_InteractGrab和VRTK_InteractUse脚本。主要设置抓取按键和操作按键。
其次制作交互的物体Gun和Whirlygig。同时编写各自的交互脚本,脚本继承于VRTK_InteractableObject。
Gun
Gun是从VRTK_InteractableObject派生出的脚本组件是对比较简单的可交互对象的应用。
namespace VRTK.Examples
{
using UnityEngine;
/// <summary>
/// 模拟射击的脚本
/// </summary>
public class Gun : VRTK_InteractableObject
{
private GameObject bullet;
/// <summary>
/// 子弹的速度
/// </summary>
private float bulletSpeed = 1000f;
/// <summary>
/// 子弹射出去之后的生命周期
/// </summary>
private float bulletLife = 5f;
/// <summary>
/// trigger press 执行,即抓取后的操作
/// </summary>
/// <param name="usingObject"></param>
public override void StartUsing(VRTK_InteractUse usingObject)
{
base.StartUsing(usingObject);
//开火
FireBullet();
}
/// <summary>
/// 游戏开始之后的初始化
/// </summary>
protected void Start()
{
//找到子弹
bullet = transform.Find("Bullet").gameObject;
//默认子弹不显示
bullet.SetActive(false);
}
/// <summary>
/// 开火
/// </summary>
private void FireBullet()
{
//实例化一个子弹,即克隆体
GameObject bulletClone = Instantiate(bullet, bullet.transform.position, bullet.transform.rotation) as GameObject;
//激活子弹,可见
bulletClone.SetActive(true);
//获取子弹上的刚体组件(运动,模拟受力状况的组件)
Rigidbody rb = bulletClone.GetComponent<Rigidbody>();
//对子弹施加力的作用(方向+大小)
rb.AddForce(-bullet.transform.forward * bulletSpeed);
//子弹射出之后的生命周期,之后自动销毁
Destroy(bulletClone, bulletLife);
}
}
}
Whirlygig
Whirlygig也是继承自VRTK_InteractableObject,使盒子上的胶囊体旋转起来。
namespace VRTK.Examples
{
using UnityEngine;
/// <summary>
/// 旋转的胶囊
/// </summary>
public class Whirlygig : VRTK_InteractableObject
{
//速度
float spinSpeed = 0f;
//胶囊体的引用
Transform rotator;
/// <summary>
/// 抓取之后,扣动扳机之后触发,旋转速度为360
/// </summary>
/// <param name="usingObject"></param>
public override void StartUsing(VRTK_InteractUse usingObject)
{
base.StartUsing(usingObject);
spinSpeed = 360f;
}
/// <summary>
/// 松开扳机后触发,旋转速度为0
/// </summary>
/// <param name="usingObject"></param>
public override void StopUsing(VRTK_InteractUse usingObject)
{
base.StopUsing(usingObject);
spinSpeed = 0f;
}
/// <summary>
/// 游戏开始时,获取胶囊体的引用
/// </summary>
protected void Start()
{
rotator = transform.Find("Capsule");
}
/// <summary>
/// 每一帧的操作,对胶囊体的旋转
/// </summary>
protected override void Update()
{
base.Update();
rotator.transform.Rotate(new Vector3(spinSpeed * Time.deltaTime, 0f, 0f));
}
}
}