VR模拟枪支打靶,消灭鬼怪,换弹以及上弦等等硬核枪支操作。 使用HTCVive设备,开启SteamVR进行游玩。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

442 lines
17 KiB

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using HTC.UnityPlugin.Vive;
//教程部分的关卡
//玩家一旦进入该场景,会提前弹出窗口,询问是否进行教学
//如果不需要,自动解除像素
public class PixelAppear : MonoBehaviour {
public GameObject box_;
public GameObject pixelImage;
public GameObject[] PannelObj;
private GameObject newPixel;
private Pixel pixelList;
private bool isDisappearing;
public GameObject[] allPixelO;
private List<Pixel> allPixelI;
//是否需要进行教程(不再提示)
private bool isNeedTeach;
//是否需要进行教程(提示)
private bool confirmNeedTeach;
//获取镜头
private GameObject Camera_;
//获取右侧手柄
private GameObject rightHand_;
//获取玩家对象
private GameObject Player_;
//教学步骤
private int teachingStep_;
public GameObject[] ConfirmCamera_;
public GameObject ConfirmCameraAll_;
public GameObject[] ConfirmHand;
public GameObject ConfirmHandAll_;
public GameObject[] ConfirmFeet;
public GameObject ConfirmFeetAll_;
public GameObject TeachingArrow_;
public GameObject TeachingMoving_;
public GameObject TeachingUsing_;
//教学文字
public Text teachingTxt;
// Use this for initialization
void Start () {
pixelAppear();
isDisappearing = false;
Camera_ = GameObject.FindGameObjectWithTag("MainCamera");
rightHand_ = GameObject.FindGameObjectWithTag("rightHand");
Player_ = GameObject.FindGameObjectWithTag("Player");
teachingStep_ = 0;
StartSelect();
}
// Update is called once per frame
void Update () {
/*if (Input.GetKeyDown(KeyCode.A)) {
isDisappearing = true;
}*/
if (isDisappearing) {
/*foreach (Pixel pixelI in allPixelI) {
pixelI.disappearPixel();
}*/
pixelDisappear();
}
box_.transform.position = new Vector3(Camera_.transform.position.x, 1.3f, Camera_.transform.position.z-1.5f);
}
//制造像素,并把像素放置在固定的数组里面
void pixelAppear() {
for (int panel_num = 0; panel_num < PannelObj.Length; panel_num++) {
for (int j = 0; j < 15; j++)
{
for (int i = 0; i < 15; i++)
{
newPixel = Instantiate(pixelImage, PannelObj[panel_num].transform);
newPixel.transform.localPosition = new Vector3(i * 4f - 28f, j * 4f - 28f, 0f);
//pixelArray.Add(newPixel);
pixelList = newPixel.GetComponent<Pixel>();
pixelList.x = i;
pixelList.y = j;
//float actionNo = (Mathf.Abs(7 - i) + Mathf.Abs(7 - j));
pixelList.randomTime = Random.Range(0.75f,3.5f);
}
}
}
}
void pixelDisappear() {
allPixelO = GameObject.FindGameObjectsWithTag("Pixel");
for (int i = 0;i<allPixelO.Length;i++) {
//print(allPixelO[i].GetComponent<Pixel>().x);
allPixelO[i].GetComponent<Pixel>().disappearPixel();
}
//isDisappearing = true;
}
//开始时是否进行教程操作
private void StartSelect() {
StartCoroutine(TeachActionAll());
}
//教程逻辑实现
IEnumerator TeachActionAll() {
print("StartTeaching");
yield return StartCoroutine(TeachAction_0());
print("EndTeaching");
isDisappearing = true;
}
//确认是否跳过教程
IEnumerator TeachAction_0() {
while (teachingStep_ != -1) {
if (ViveInput.GetPress(HandRole.RightHand, ControllerButton.Trigger))
{
teachingStep_ = 1;
yield return StartCoroutine(TeachAction_1());
yield return StartCoroutine(TeachAction_2());
yield return StartCoroutine(TeachAction_3());
yield return StartCoroutine(TeachAction_4());
yield return StartCoroutine(TeachAction_5());
yield return StartCoroutine(TeachAction_6());
yield return StartCoroutine(TeachAction_end());
teachingStep_ = -1;
}
else if (ViveInput.GetPress(HandRole.LeftHand, ControllerButton.Trigger))
{
yield return StartCoroutine(TeachAction_end());
teachingStep_ = -1;
}
yield return new WaitForEndOfFrame();
}
yield return null;
}
//教程1
IEnumerator TeachAction_1() {
ConfirmCameraAll_.SetActive(true);
teachingTxt.text = "请上下左右晃动头部,检测头盔精度";
Vector3 startPos = Camera_.transform.localEulerAngles;
int correctCamera = 0;
float radiusX = 0;
float radiusY = 0;
ImageChange_ imageChangeScript1 = ConfirmCamera_[0].GetComponent<ImageChange_>();
ImageChange_ imageChangeScript2 = ConfirmCamera_[1].GetComponent<ImageChange_>();
ImageChange_ imageChangeScript3 = ConfirmCamera_[2].GetComponent<ImageChange_>();
ImageChange_ imageChangeScript4 = ConfirmCamera_[3].GetComponent<ImageChange_>();
while (teachingStep_ != 2) {
radiusX = Camera_.transform.localEulerAngles.x - startPos.x;
radiusY = Camera_.transform.localEulerAngles.y - startPos.y;
if (radiusX < -180f) {
radiusX += 360f;
} else if (radiusX >180f) {
radiusX -= 360f;
}
if (radiusY < -180f)
{
radiusY += 360f;
}else if (radiusY > 180f)
{
radiusY -= 360f;
}
if (!imageChangeScript1.ischange && radiusX < -30f) {
imageChangeScript1.SetChange();
startPos = Camera_.transform.localEulerAngles;
correctCamera++;
}
if (!imageChangeScript2.ischange && radiusX > 30f)
{
imageChangeScript2.SetChange();
startPos = Camera_.transform.localEulerAngles;
correctCamera++;
}
if (!imageChangeScript3.ischange && radiusY < -30f)
{
imageChangeScript3.SetChange();
startPos = Camera_.transform.localEulerAngles;
correctCamera++;
}
if (!imageChangeScript4.ischange && radiusY > 30f)
{
imageChangeScript4.SetChange();
startPos = Camera_.transform.localEulerAngles;
correctCamera++;
}
if (correctCamera == 4)
{
teachingStep_ = 2;
}
yield return new WaitForEndOfFrame();
}
ConfirmCameraAll_.SetActive(false);
yield return null;
}
//教程2
IEnumerator TeachAction_2()
{
ConfirmHandAll_.SetActive(true);
teachingTxt.text = "请上下左右晃动右手柄,检测手部精度";
Vector3 startPos = rightHand_.transform.position;
int correctHand = 0;
float distanceX = 0;
float distanceY = 0;
float distanceZ = 0;
float distanceXZ = 0;
ImageChange_ imageChangeScript1 = ConfirmHand[0].GetComponent<ImageChange_>();
ImageChange_ imageChangeScript2 = ConfirmHand[1].GetComponent<ImageChange_>();
ImageChange_ imageChangeScript3 = ConfirmHand[2].GetComponent<ImageChange_>();
ImageChange_ imageChangeScript4 = ConfirmHand[3].GetComponent<ImageChange_>();
while (teachingStep_ != 3)
{
distanceX = rightHand_.transform.position.x - startPos.x;
distanceY = rightHand_.transform.position.y - startPos.y;
distanceZ = rightHand_.transform.position.z - startPos.z;
distanceXZ = distanceX + distanceZ;
if (!imageChangeScript1.ischange && distanceY > 0.2f)
{
imageChangeScript1.SetChange();
startPos = rightHand_.transform.position;
correctHand++;
}
if (!imageChangeScript2.ischange && distanceY < -0.2f)
{
imageChangeScript2.SetChange();
startPos = rightHand_.transform.position;
correctHand++;
}
if (!imageChangeScript3.ischange && distanceXZ > 0.2f)
{
imageChangeScript3.SetChange();
startPos = rightHand_.transform.position;
correctHand++;
}
if (!imageChangeScript4.ischange && distanceXZ < -0.2f)
{
imageChangeScript4.SetChange();
startPos = rightHand_.transform.position;
correctHand++;
}
if (correctHand == 4)
{
teachingStep_ = 3;
}
yield return new WaitForEndOfFrame();
}
ConfirmHandAll_.SetActive(false);
yield return null;
}
//教程3
IEnumerator TeachAction_3()
{
ConfirmFeetAll_.SetActive(true);
teachingTxt.text = "请在房间进行走动(指现实)";
Vector3 startPos = Camera_.transform.position;
int correctFeet = 0;
float distanceX = 0;
float distanceZ = 0;
ImageChange_ imageChangeScript1 = ConfirmFeet[0].GetComponent<ImageChange_>();
ImageChange_ imageChangeScript2 = ConfirmFeet[1].GetComponent<ImageChange_>();
ImageChange_ imageChangeScript3 = ConfirmFeet[2].GetComponent<ImageChange_>();
ImageChange_ imageChangeScript4 = ConfirmFeet[3].GetComponent<ImageChange_>();
while (teachingStep_ != 4)
{
distanceX = Camera_.transform.position.x - startPos.x;
distanceZ = Camera_.transform.position.z - startPos.z;
if (!imageChangeScript1.ischange && distanceX > 0.5f)
{
imageChangeScript1.SetChange();
startPos = Camera_.transform.position;
correctFeet++;
}
if (!imageChangeScript2.ischange && distanceX < -0.5f)
{
imageChangeScript2.SetChange();
startPos = Camera_.transform.position;
correctFeet++;
}
if (!imageChangeScript3.ischange && distanceZ > 0.5f)
{
imageChangeScript3.SetChange();
startPos = Camera_.transform.position;
correctFeet++;
}
if (!imageChangeScript4.ischange && distanceZ < -0.5f)
{
imageChangeScript4.SetChange();
startPos = Camera_.transform.position;
correctFeet++;
}
if (correctFeet == 4)
{
teachingStep_ = 4;
}
yield return new WaitForEndOfFrame();
}
ConfirmFeetAll_.SetActive(false);
isDisappearing = true;
yield return null;
}
//教程4
IEnumerator TeachAction_4() {
Player_.GetComponent<MovingCtrol>().enabled = true;
teachingTxt.text = "按住右手柄的圆板键前进&后退\n转头进行控制方向";
TeachingArrow_.SetActive(false);
TeachingMoving_.SetActive(true);
yield return new WaitForSeconds(10.0f);
TeachingMoving_.SetActive(false);
yield return null;
}
//教程5
public GameObject highLightClip;
public GameObject highLightSwiftArch;
IEnumerator TeachAction_5() {
Player_.GetComponent<PlayerControl>().enabled = true;
Player_.GetComponent<PlayerControl>().Weapon_.SetActive(true);
teachingTxt.text = "按下左手柄的圆板键切换武器\n十秒后进入下一教学";
TeachingMoving_.SetActive(false);
TeachingUsing_.SetActive(true);
yield return new WaitForSeconds(10.0f);
//换弹药教学
teachingTxt.text = "按下左手柄处的手柄键进行换弹";
Player_.GetComponent<PlayerControl>().lockChange = true;
Player_.GetComponent<PlayerControl>().padUpPublic();
bool createClip = false;
bool releaseClip = false;
bool releaseSwiftArch = false;
AkGun ak_ = GameObject.FindGameObjectWithTag("gun").GetComponent<AkGun>();
while (!createClip) {
if (ViveInput.GetPress(HandRole.LeftHand, ControllerButton.Grip))
{
createClip = true;
}
yield return new WaitForEndOfFrame();
}
highLightClip.SetActive(true);
while (!releaseClip) {
teachingTxt.text = "将左手中的弹药插进弹药槽上";
if (ak_.getHaveBulletClip()) {
releaseClip = true;
};
yield return new WaitForEndOfFrame();
}
highLightClip.SetActive(false);
highLightSwiftArch.SetActive(true);
while (!releaseSwiftArch)
{
teachingTxt.text = "拉动枪栓后,就完成弹药的装填工作了";
if (ak_.bulletClip.isUsed) {
releaseSwiftArch = true;
}
yield return new WaitForEndOfFrame();
}
highLightSwiftArch.SetActive(false);
teachingTxt.text = "恭喜您,已经完成了换弹操作!\n五秒后进入下一教学";
//-------------------------//
yield return new WaitForSeconds(5.0f);
teachingTxt.text = "按下右手柄处的手柄键进行治疗";
bool createNeedle = false;
bool cureHp = false;
Player_.GetComponent<Player>().hp = 70;
while (!createNeedle)
{
if (ViveInput.GetPress(HandRole.RightHand, ControllerButton.Grip))
{
createNeedle = true;
}
yield return new WaitForEndOfFrame();
}
while (!cureHp)
{
teachingTxt.text = "请对准左手,当针亮起时,按住右扳机进行恢复";
if (Player_.GetComponent<Player>().hp >= 100)
{
cureHp = true;
}
yield return new WaitForEndOfFrame();
}
teachingTxt.text = "恭喜您,已经完成了治疗操作!\n五秒后进入下一教学";
Player_.GetComponent<PlayerControl>().gripRightPublic();
yield return new WaitForSeconds(5.0f);
TeachingUsing_.SetActive(false);
yield return null;
}
//教程6
public GameObject highLightSlider;
IEnumerator TeachAction_6() {
teachingTxt.text = "请用指针指向其中的一个配件";
Player_.GetComponent<PlayerControl>().leftPointer.SetActive(true);
MenuController_2 menu = GameObject.FindGameObjectWithTag("menu").GetComponent<MenuController_2>();
menu.openMenu(3);
bool selectItem = false;
bool installItem = false;
while (!installItem) {
if (ViveInput.GetPressDown(HandRole.LeftHand, ControllerButton.Trigger) && selectItem)
{
selectItem = false;
highLightSlider.SetActive(false);
teachingTxt.text = "请用指针指向其中的一个配件";
}
if (!selectItem && !Player_.GetComponent<PlayerControl>().leftPointer.activeSelf) {
selectItem = true;
highLightSlider.SetActive(true);
teachingTxt.text = "请将配件放置在枪的滑槽上面";
}
if (selectItem && Player_.GetComponent<PlayerControl>().leftPointer.activeSelf) {
highLightSlider.SetActive(false);
installItem = true;
}
yield return new WaitForEndOfFrame();
}
teachingTxt.text = "可以用左手按住扳机拖动刚安装的配件,调整到合适的位置";
Player_.GetComponent<PlayerControl>().lockChange = false;
yield return new WaitForSeconds(5.0f);
teachingTxt.text = "恭喜您,已经完成了所有教学";
yield return new WaitForSeconds(5.0f);
yield return null;
}
//教程结束
public GameObject teachScreen;
IEnumerator TeachAction_end() {
MenuController_2 menu = GameObject.FindGameObjectWithTag("menu").GetComponent<MenuController_2>();
menu.openMenu(4);
teachingTxt.text = "";
Player_.GetComponent<PlayerControl>().rightPointer.SetActive(true);
Player_.GetComponent<PlayerControl>().leftPointer.SetActive(true);
Player_.GetComponent<PlayerControl>().Weapon_.SetActive(false);
Player_.GetComponent<PlayerControl>().enabled = false;
Player_.GetComponent<MovingCtrol>().enabled = true;
box_.SetActive(false);
teachScreen.SetActive(false);
yield return null;
}
}