2017年4月5日 星期三

Week05 楊淳安

VR教學:

CameraRig
Camera(eye)
Camera(ears)
地球自轉
蹺蹺板
指北針
物體抓取

Week06 楊淳安

VR 小遊戲教學

製作一款將物品丟向瓶子的遊戲
使用手把控制
將球拾取後丟向瓶子
並將瓶子擊倒

2017年4月4日 星期二

Week06 實做加影片

1. 案住Trigger後可產生多個方塊

程式碼 : 

成果 :


2. 抓取物體

程式碼 : 


成果 : 


3. 光劍

程式碼 : 


成果 :



4. HitBottleVR 丟瓶子

程式碼 : 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(SteamVR_TrackedObject))]
public class ThrowObjectResetBottle : MonoBehaviour {

SteamVR_TrackedObject trackedObj;
SteamVR_Controller.Device device;
public float speedUp=3.0f;

// 將來代入兩個prefab
public GameObject Ball,Bottle;

// 記錄BottleFall 程式的參考變數
BottleFall bottleFallScript;

// 記錄目前產生的球的參考變數
GameObject ball;

        void Awake () 
       {
                 trackedObj = GetComponent<SteamVR_TrackedObject> ();
                 // 目前沒有產生的球
                 ball = null;
                //先找到BottleStand物件, 再找到BottleFall.cs程式,並記錄下來
                bottleFallScript = GameObject.Find ("BottleStand").GetComponent<BottleFall>();

       }

       void FixedUpdate () 
      {
               device = SteamVR_Controller.Input ((int)trackedObj.index);
               if (device.GetTouchUp (SteamVR_Controller.ButtonMask.Grip))
              {
                         if (ball == null) 
                        {
                                   // 目前沒有球,就產生一顆
                                   ball = GameObject.Instantiate (Ball);

                                   // 固定住, 不受重力與物理引擎的作用
                                   ball.GetComponent<Rigidbody> ().isKinematic = true;

                                  // 移動至想要的位置
                                   ball.transform.position = new Vector3 (0.5f, 1f, 0f);
                        }

                       if (! bottleFallScript.bottleOnTable) 
                      {

                                // 如果桌上沒瓶子有,就產生一個
                               GameObject bottle = GameObject.Instantiate (Bottle);

                               // 找到桌子的位置
                               Vector3 tablePos = GameObject.Find ("Table").transform.position;

                               // 將瓶子放在上方 0.8個單位的地
                               bottle.transform.position = new Vector3 (0f, 0.8f, 0f) + tablePos;

                              // 設定 bottleOnTable 設定為真
                              bottleFallScript.bottleOnTable = true;
                     }
           }

     }

    void OnTriggerStay(Collider col) 
     {
             Debug.Log ("碰到");
             if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger))
            { 
                          Debug.Log ("抓起");

                         // 將 physics(物理引擎) 關掉
                         col.attachedRigidbody.isKinematic = true;

                        // 設定controller為parent
                        col.gameObject.transform.SetParent(gameObject.transform);
             }

            if (device.GetTouchUp (SteamVR_Controller.ButtonMask.Trigger)) 
           {
                       Debug.Log ("放開");

                     // 將球的parent設定為空的,解除父子關係
                     col.gameObject.transform.SetParent (null);

                    // 讓球受物理引擎(重力)影響
                    col.attachedRigidbody.isKinematic = false;

                   // 將球設定 3秒鐘之後自動銷毀
                   GameObject.Destroy (col.gameObject, 3f);

                  // 設定目前沒有可丟的球
                   ball = null;

                  // 找到HUD物件,在Ranking.cs程式中,記錄丟球個數增加 1
                  GameObject.Find ("HUD").GetComponent<Ranking> ().tossInc ();

                 // 將球丟出去
                 tossObject (col.attachedRigidbody);
         }

     }

       void tossObject(Rigidbody rigidBody)   
      {
                  // 球繼承controller的速度與轉速
                  rigidBody.velocity=device.velocity*speedUp;
                  rigidBody.angularVelocity=device.angularVelocity;
      }


}

成果 : 

2017年3月31日 星期五

Week05_一般Unity專案轉UnityVR版本_呂登祐

其實Unity傳統專案跟VR的差別就在視角及contorller不同上,以下範例將為個位作介紹,如何把VR攝影機camera套用在一般專案上的camera上,及contorller控制器套用在Vive手把上。

SeasawPC Asset簡介

MainCamera
Floor
Rigidbody
Use Gravity: false
Is Kinemaic: true
Bearing
Board
Rigidbody
Freeze Position: x,y,z
中心點不移動
Freeze Rotation: x,y
X軸與y軸不可旋轉, z軸可旋轉

Person A 與 B
Rigidbody
Mass: 70
Use Graity: true
Fixed Joint
Connected Body: Board(Rigidbody) 固定連結在board上
Box Collider
Ground A 與 B
Empty
Box collider
Trigger: true
Reversion Script
以改變質量來使Board搖擺


參考網址:https://drive.google.com/drive/folders/0B3U4TWW5it5nQ2NHRWxuNEJfUFk




2017年3月30日 星期四

week06

到s205實作
用手把偵測產生設定好的prefabs物件
然後就可以做出類似畫畫的效果





.

程式碼如下
using UnityEngine;
using System.Collections;
using Valve.VR;

public class Create : MonoBehaviour {

public SteamVR_TrackedObject rightController;
public GameObject redCube;
public GameObject blueCube;
public GameObject box;
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
var device = SteamVR_Controller.Input ((int)rightController.index);
if (device.GetPressDown (SteamVR_Controller.ButtonMask.Trigger)) {
Instantiate (redCube, rightController.transform.position, rightController.transform.rotation, box.transform);

}
if (device.GetPress (SteamVR_Controller.ButtonMask.Trigger)) {
Instantiate (blueCube, rightController.transform.position, rightController.transform.rotation, box.transform);

}
if (device.GetPressUp (SteamVR_Controller.ButtonMask.Trigger)) {
foreach (Transform child in box.transform) {
GameObject.Destroy (child.gameObject);
}
}
}
}



第二個實作
是要把場景中的物件抓取起來
按下版機就可以當手一樣 把物件抓取起來



程式碼如下:
using UnityEngine;
using System.Collections;

public class Touch : MonoBehaviour {

public SteamVR_TrackedObject leftController;
bool isTouch=false;
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
var device = SteamVR_Controller.Input ((int)leftController.index);
if (device.GetPressDown (SteamVR_Controller.ButtonMask.Trigger)) {
isTouch = true;
}
if (device.GetPressUp (SteamVR_Controller.ButtonMask.Trigger)) {
isTouch = false;
}
}
void OnTriggerStay(Collider other){
if (other.tag == "catch" && isTouch) {
other.transform.position = this.transform.position;
}
}
}



第三個實作(回家作業)

將模型套入
讓手把在實境內是以光劍模組顯示








































成功後就可以像絕地武士一樣揮舞光劍了!!!!




程式碼如下:
using UnityEngine;
using System.Collections;

public class LightSaberContol : MonoBehaviour {

public SteamVR_TrackedObject Controller;
public GameObject centerBeam;
lightsaber saberOn,saberCenterBeam;


void Start () {
saberOn = this.GetComponent<lightsaber> ();
saberCenterBeam = centerBeam.GetComponent<lightsaber> ();


}

// Update is called once per frame
void Update () {
if (Controller == null)
return;
var device = SteamVR_Controller.Input ((int)Controller.index);
if (device.GetPressDown (SteamVR_Controller.ButtonMask.Grip)) {
saberOn.saberon = !saberOn.saberon;
saberCenterBeam.saberon = !saberCenterBeam.saberon;
print ("Grip");
}

}
}


2017年3月29日 星期三

Week 06 ㄏㄒ - 夏日課程DLC遭流出 網友 : 私

立人上課 ~

丟瓶子的遊戲製作

以抓起球 (物件) 來擊中瓶子的遊戲

手把抓取物件

Week 06 D:

今天一樣是蕭老師上課~

然後今天不同的是分兩批,分別樓上樓下樓下今天教的如下

課堂作業:
一共有兩個分別是 按著按鍵連續輸出物體 以及 抓取物體
首先是連續輸出
當你按下按鍵之後就會一直產生物體

程式碼如下


按下去的瞬間(由於紅色方塊是讓我們確認,然而因為連續輸出藍色的關系所以會有閃爍的現象)

一堆方塊~




在來是抓取物體

程式碼


開始的畫面


拿起來了~




回家作業

光劍
讓你的光劍能伸縮

程式碼

讚哦~