2016年6月26日 星期日

Unreal: Collision > Damage

since: 2016/06/26
update: 2016/06/26

reference:
1. Unreal Engine 4 Documentation | Unreal Engine

A. 新增專案
    1. New Project > Blueprint > First Person:
        > Desktop / Console  > Maximum Quality > No Starter Content
        > Folder ... > Name ... > Create Project

    2. 調整右前方的黑色大牆: (原名為 BigWall2)
        > 名稱改為: Enemy
        > 勾選: Simulation Generates Hit Events
        > Collision Presets: 選取 BlockAll

    3. 建立 EnemyBlueprint:
        > 選取 Enemy
        > "Blueprint / Add Script"
        > "Create Blueprint"

    4. EnemyEvent Graph:
        > 新增 Event Hit Node
        > 從 Event Hit Node 的 Hit Pin, 連結 Break Hit Result Node
        > 新增 Apply Damage Node
        > 將 Event Hit Node 的 Exe Pin, 連結 Apply Damage Node 的 Exe Pin
        > 將 Event Hit Node 的 Other Pin,
          連結 Apply Damage Node 的 Damaged Actor Pin

-----------------------------------------------------------------------------------------------

B. Character Blueprint:

    1. 開啟 FirstPerson Character Blueprint:

    2. 在 Event Graph 裡, 新增 Event Anydamage Node, 並新增變數: Health 

   > Health 變數的型態為 float, 預設值為 100.0

    3. 印出剩餘的生命點數
        > 藉由 float 減 float node 取的剩餘的生命點數(Get Health 減去 Damage pin 的值)
        > 再將 剩餘的生命點數 (float 減 float node 的輸出 pin) 設(Set)給 Health
        > 最後將結果印出來.

    4. 結果:
        當玩家碰撞到 Enemy 時, 生命值持續快速遞減

-----------------------------------------------------------------------------------------------

C. 讓玩家半秒內只會受傷一次
    1. 修改 FirstPerson Character Blueprint:
        > 新增 DoOnce Node 與 Delay Node
        > DoOnce Node 預設只會作一次(執行 Set Health)
        > 在列印出剩餘生命值後, 會先 Delay 5 秒, 然後 Reset DoOnce Node
        > DoOnce Node 於 Reset 後, 又可以執行一次了.(依此循環)

    2. 結果: 當玩家碰撞到 Enemy 時, 生命值半秒內只會扣一次(10 點)


-----------------------------------------------------------------------------------------------

D. 當玩家生命值小於或等於零時, 就消失
    1. 新增 Node: float <= float , Branch, DestroyActor
        > 取得 Set Health 的生命值, 來作 Branch 處理
        > 如果生命值小於或等於 0, 就執行 DestroyActor
        > 如果生命值大於 0, 就印出數值 (並且 Delay -> Reset DoOnce ...)

    2. 結果: 當玩家碰撞到 Enemy, 生命值小於或等於 0 時, 玩家就消失了(destroyed)

2016年6月25日 星期六

Unreal: Collision

since: 2016/06/25
update: 2016/06/25

reference:
1. Unreal Engine 4 Documentation | Unreal Engine

A.  新增專案:
     1. New Project > Blueprint > Blank:
        > Desktop / Console  > Maximum Quality > No Starter Content
        > Folder ... > Name ... > Create Project

     2. 在 Level Editor 裡,  新增 Cube  與 Sphere

     3. 進入遊戲: Sphere 浮在空中

-----------------------------------------------------------------------------------------------

B. Hit Event(擊中事件)
    1. 在 Level Editor 裡, 選取 Cube:
        > 勾選: Simulation Generates Hit Events
        > Collision Presets: 選取 Custom
        > Collision Enabled: 選取 Collision Enabled
        > Object Type: 選取 WorldStatic

    > 在 Trace Responses 下,
    > 對於 PhysicsBody (將是 Sphere 的 Object Type),  確認勾選 Block

    2. 在 Level Editor 裡, 選取 Sphere:
        > 確認勾選: Simulate Physics
        > 確認勾選: Enable Gravity

        > 勾選: Simulation Generates Hit Events
        > Collision Presets: 選取 Custom
        > Collision Enabled: 選取 Collision Enabled
        > Object Type: 選取 PhysicsBody

    > 在 Trace Responses 下,
    > 對於 WorldStatic (Cube 的 Object Type),  確認勾選 Block

    3. 新增 CubeBlueprint, 並加入 Event Hit
        > 選取 Cube
        > "Blueprint / Add Script"
        > "Create Blueprint"

    > 滑鼠右鍵
    > Add Event > Collision > Event Hit

    > 將產生的 Event Hit Node 與 PrintString Node 連結

    4. 結果: 當 Sphere 往下掉落撞擊到 Cube 時, 印出一大串的 Hit 字串

-----------------------------------------------------------------------------------------------

C. Overlap Event(交疊事件)
    1. 在 Level Editor 裡, 選取 Sphere:
        > 勾選: Generate Overlap Events

    > 在 Trace Responses 下,
    > 對於 WorldStatic (Cube 的 Object Type),  確認勾選 Overlap

    2. 在 Level Editor 裡, 選取 Cube_Blueprint:
        > 勾選: Generate Overlap Events

    > 在 Trace Responses 下,
    > 對於 PhysicsBody (Sphere 的 Object Type),  確認勾選 Overlap

    3. 打開 Cube_Blueprint, 並加入  Event ActorBeginOverlap
    > 滑鼠右鍵
    > Add Event > Collision > Event ActorBeginOverlap

    > 將產生的 Event ActorBeginOverlap Node 與 PrintString Node 連結

    4. 結果: 當 Sphere 往下掉落與 Cube 交疊時, 印出一次 BeginOverlap 字串

2016年6月23日 星期四

Unreal: OSC Plugin For UE4 ---- 4/4

since: 2016/06/23
update: 2016/11/25

reference:
1. [Plugin] OSC for UE4
2. monsieurgustav/UE4-OSC
3. UE4-OSCの送受信を行う - Qiita

4. I touchs: Unreal: OSC Plugin For UE4 ---- 1/4
5. I touchs: Unreal: OSC Plugin For UE4 ---- 2/4
6. I touchs: Unreal: OSC Plugin For UE4 ---- 3/4

Stage 4/4: OSC Sender

A. 新增 OSCSender Blueprint
    1. > Content Browser
        > AddNew > Blueprint Class > Actor
        > 命名為 OSCSender > 滑鼠雙擊打開

    2. 在 Event Graph 裡, 新增 Send Osc Node 並與 Event Tick 連結

    3. 新增取得 Actor 位置與 OSC Address 的變數:
        Type: Actor Reference    變數名稱: Source , 可編輯 
        Type: Name                      變數名稱: Address, 可編輯

-----------------------------------------------------------------------------------------------

B. OscSender Event Graph
     1. 由 GetActorLocation 取得 Source 的位置

     2. 將其座標拆成三個 float 當成 Send OscData

     3. Send OscAddress 值將在 Level Editor 裡設定

-----------------------------------------------------------------------------------------------

C. OSC Sendr 設定
    1. 回到 Level Editor, 將 OSCSenderContent Browser 拖拉到場景裡.
        在 OSCSender 選取的情況下, 到 Details
        > 將 OSCSource 設為: MyCube
       
> 將 OSCAddress 設為: /position

    2. 結果:
        進入關卡後, OSCSender 發送 MyCube 本身的位置給 OSCReceiver,
        而 OSCReceiver 將此座標更新給 MyCylinder.  
        > MyCylinder 跟隨著 MyCube 上下移動了.

-----------------------------------------------------------------------------------------------

D. 備註
     1. 可供測試用的 Processing code:(version 2.2.1)
/**
 * oscP5sendreceive by andreas schlegel
 * example shows how to send and receive osc messages.
 * oscP5 website at http://www.sojamo.de/oscP5
 */


import oscP5.*;
import netP5.*;

OscP5 oscP5;
NetAddress myRemoteLocation;

int receivePort = 8000;
String sendIP = "127.0.0.1";
int sendPort = 8000;

void setup() {
  size(400,400);
  frameRate(25);
  /* start oscP5, listening for incoming messages at port 12000 */
  oscP5 = new OscP5(this, receivePort);

  /* myRemoteLocation is a NetAddress. a NetAddress takes 2 parameters,
   * an ip address and a port number. myRemoteLocation is used as parameter in
   * oscP5.send() when sending osc packets to another computer, device,
   * application. usage see below. for testing purposes the listening port
   * and the port of the remote location address are the same, hence you will
   * send messages back to this sketch.
   */

  myRemoteLocation = new NetAddress(sendIP, sendPort);
}


void draw() {
  background(0); 
}

void mousePressed() {
  /* in the following different ways of creating osc messages are shown by example */
  OscMessage myMessage = new OscMessage("/position");

  //myMessage.add(123); /* add an int to the osc message */
  myMessage.add(100.0);
  myMessage.add(200.0);
  myMessage.add(300.0);

  /* send the message */
  oscP5.send(myMessage, myRemoteLocation);
}


/* incoming osc message are forwarded to the oscEvent method. */
void oscEvent(OscMessage theOscMessage) {
  /* print the address pattern and the typetag of the received OscMessage */
  print("### received an osc message.");
  print(" addrpattern: "+theOscMessage.addrPattern());
  println(" typetag: "+theOscMessage.typetag());

  theOscMessage.print();
}


    2.  一般情況下, OSC Receiver 端先啟動, 再啟動 OSC Sender

-----------------------------------------------------------------------------------------------

E. VR 事件觸發 send OSC

    1. 說明: 原本要使用 Trigger Volume 來處理事件的觸發, 但是在 VR 裡沒有作用,
                 下次再使用手把的方式來試試.

    2. 先做 "修正 VR 的地平線水平高度" 的處理:
        參考: I touchs: Unreal: Begin A Virtual Reality Project
        > C. 修正 VR 的地平線水平高度


    3. 匯入 .obj 檔, 來源: 2150_tid_rock.zip.zip

    4. 滑鼠雙擊 VR_Pawn , 進入編輯畫面.

    5. 新增 Static Mesh Component

    6. 取名為 StoneMesh 並拖拉到 Camera 下方

    7. 在 StoneMesh 點選的情況下, 到右邊 Details:
        調整 Location 位置, 與 Scale 數值, 並指定所要使用的 Static Mesh.
        說明: a. 此處的 Location 是相對於其 parent (Camera) 的座標.
                  b. 由於 Static Mesh 主要用來作事件觸發, 不需要顯示出來,
                      因此可以縮放到很小.

    8. 調整 Collision 下的:
        > 確認勾選: Generate Overlap Events
        > Collision Presets: Trigger

    9. 新增 Event:
        On Component Begin Overlap
        與 On Component End Overlap

   10. 結果:

   11.補上 Send OSC 的機制

   12. 新增一個 Sphere 到場景裡, 調整大小並靠近 PlayerStart 位置.

   13. 點選 Sphere, 在其 Details 裡, 調整 Collision 屬性: 
        > 確認勾選: Generate Overlap Events
        > Collision Presets: Trigger