一、场景搭建
二、制作开始按钮
三、制作游戏背景
四、开始界面交互
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//此脚本挂在手柄上
public class MenuController : MonoBehaviour
{
//持有设备的引用 吧手柄那过来
public SteamVR_TrackedObject trackedObject;
//按钮被按下时改变按钮颜色
//持有颜色的引用
public Renderer btnRenderer;
//声明公开材质球 用来切换颜色的;
public Material btnMat;
public Material btnMat2;
//触发进逗留事件
private void OnTriggerStay(Collider collider)
{
//判断触发器是否持有按钮上的脚本
//先声明持有该引用
StartButton startBtn = collider.GetComponent<StartButton>();
//判断是否有此脚本 不为空证明持有
if (startBtn != null)
{
//获取按键的下标
SteamVR_Controller.Device device = SteamVR_Controller.Input((int)trackedObject.index);
//判断按下手柄的键
if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger))
{
//然后执行挂在开始按钮上脚本的函数 按钮上的脚本是公开的;
startBtn.Btndown();
}
}
}
//按钮替换材质球 上面已经公开引用Cube按钮
//判断进入和离开即可
private void OnTriggerEnter(Collider collider)
{
btnRenderer.material = btnMat2;
}
private void OnTriggerExit(Collider collider)
{
// btnRenderer.material = btnMat;
collider.transform.GetComponent<Renderer>().material = btnMat;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class StartButton : MonoBehaviour {
public void Btndown() {
//测试
//Debug.Log("888");
//点击后切换到正式场景中去 场景跳转
// SceneManager.LoadScene(1);//可以传场景下标或者名称;
SceneManager.LoadScene("MainGame");
}
}
五、制作飞盘发射器
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Projectile : MonoBehaviour {
//单例模式 一定要加静态修饰符
public static Projectile instance;
//公开持有的引用飞盘 预制体
public GameObject prefabs;
void Awake () {
//执行单例模式
Projectile.instance = this;
}
void Update () {
}
//公开 发射飞盘的方法;
public void ProjectileFeipan() {
//实例化飞盘
GameObject go= GameObject.Instantiate<GameObject>(prefabs);
//使用球表面的随机数 是飞盘在球的表面各个角度都能飞出来
Vector3 randomVec3 = Random.onUnitSphere;
//限制一下Y轴方向
randomVec3.y = Random.Range(10, 15);
//获取组件添加一个向上的速度
go.GetComponent<Rigidbody>().velocity = randomVec3;
}
}
六、武器的抓取
添加射线
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Gun : MonoBehaviour {
//引用
SteamVR_TrackedObject trackedObj;
//定义枪初始位置 为了获取枪口的位置
public Transform gunPoint;
//枪的特效
public LineRenderer line;
//瞄准点引用
public GameObject rayPoint;
//射击音效
public AudioSource audioSource;
void Start () {
//获取组件
trackedObj = this.GetComponent<SteamVR_TrackedObject>();
}
void Update () {
//射线
Ray ray = new Ray(gunPoint.position,gunPoint.forward);//参数1:发射的位置 参数2:发射方向
//线特效设置起点和方向位置
line.SetPosition(0,ray.origin);
// line.SetPosition(1,ray.direction*100);
//判断射线
RaycastHit hit;
if (Physics.Raycast(ray,out hit,100))
{
//吧瞄准点显示出来
rayPoint.SetActive(true);
//瞄准点的位置就是碰撞到的位置
rayPoint.transform.position = hit.point;
//特效线的末尾位置 就是碰撞点的位置
line.SetPosition(1, hit.point);
//如果碰到飞盘 进行按钮监听和控制;
if (hit.transform.tag=="FeiPan")
{
//监听按下的是那个键
SteamVR_Controller.Device device = SteamVR_Controller.Input((int)trackedObj.index);
//按下触发键
if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger))
{
//给飞盘一个向前的力
hit.transform.GetComponent<Rigidbody>().AddForce(ray.direction*800);
//动态添加刚体,有破碎效果;
//通过碰撞找到子物体的父物体
Transform parent = hit.collider.gameObject.GetComponent<Transform>().parent;
//通过父物体查找子物体以下所有的组件;
Transform[] feiPans = parent.GetComponentsInChildren<Transform>();
//给子物体添加刚体 有破碎效果
for (int i = 0; i < feiPans.Length; i++)
{
//类型是 GameObject才能添加组件;
feiPans[i].gameObject.AddComponent<Rigidbody>();
}
//播放射击音效
audioSource.Play();
}
}
}
else
{
//没碰到即隐藏;
rayPoint.SetActive(false);
//如果没碰到 就出现一条线即可;
line.SetPosition(1, ray.direction * 100);
}
}
}
七、替换枪的模型
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Games : MonoBehaviour {
//持有设备的引用
SteamVR_TrackedObject tackedObj;
//定义为了获取按键输入的引用
// SteamVR_Controller.Device device;
//定义固定关节去抓枪
// FixedJoint joint;
//定义标志位 判断抓取的是枪
bool isGun;
//枪引用
public GameObject gunMesh;
void Start () {
//获取父类脚本组件
tackedObj = this.transform.parent.GetComponent<SteamVR_TrackedObject>();
}
void Update () {
//如果拿的不是枪 就实例化飞盘
if (!isGun)
{
//监听按下的按钮;
// device = SteamVR_Controller.Input((int)tackedObj.index);
SteamVR_Controller.Device device = SteamVR_Controller.Input((int)tackedObj.index);
//获取按钮按下的操作
if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger))
{
//发射飞盘的逻辑;类是公开的 单例模式 通过静态的类点出来方法;
Projectile.instance.ProjectileFeipan();
}
}
}
//触发器逗留事件 触发时拿起枪
private void OnTriggerStay(Collider collider)
{
//为了避免按下触发键生成飞盘 先判断下触发的是不是枪
if (collider.tag=="GUN")
{
return;
}
//如果拿的是枪,进行固定关节配对手柄
// if (isGun)
// {
//监听按下的按钮;
// device = SteamVR_Controller.Input((int)tackedObj.index);
SteamVR_Controller.Device device = SteamVR_Controller.Input((int)tackedObj.index);
//获取按钮按下的操作
if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger))
{
//对手柄添加固定关节 为了抓枪
// joint = this.gameObject.AddComponent<FixedJoint>();
//把触发的物体获取刚体进行连接
// joint.connectedBody = collider.GetComponent<Rigidbody>();
//抓取之后吧枪显示出来
gunMesh.SetActive(true);
//吧手柄隐藏掉
this.gameObject.SetActive(false);
//吧触碰到的枪也隐藏掉
collider.gameObject.SetActive(false);
}
// }
}
private void OnTriggerEnter(Collider collider)
{
//为了避免按下触发键生成飞盘 先判断下触发的是不是枪
if (collider.tag == "GUN")
{
return;
}
//在里面的是后是true
isGun = true;
}
private void OnTriggerExit(Collider collider)
{
//为了避免按下触发键生成飞盘 先判断下触发的是不是枪
if (collider.tag == "GUN")
{
return;
}
//不在里面时候为false;
isGun = false;
}
}
八、完成射击