2016年6月11日 星期六

Unreal: Level Blueprint > Flow Control

since: 2016/06/11
update: 2016/06/11

reference:
1. Unreal Engine 4 Documentation | Unreal Engine



A. Branch

    1. 利用預設值為 trueShouldGameQuit 變數:
        來使 Branch 的 condition 為 true 時執行 DelayQuitGame.

    ----------------------------------------------------------------------------------
    2. 改成使用 Equal (Integer) 來判斷 X 變數的值是否為 5,
        當 Branch 的 condition 為 true 時執行 DelayQuitGame.

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

B. Do N
    1. 設定 Do N 最多只能執行 5 次, 按 F 鍵執行, 按 G 鍵可以重設(次數歸零)
  
   結果: 進入遊戲關卡, 按 F 鍵 5 次最多可以顯示的訊息.
             第6次之後就不再顯示, 除非按 G 鍵重設

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

    2. 改成直接將 Do NCounter(執行計數), 列印出來(會自動轉型)

   結果:

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

C. DoOnce 與 DoOnce MultiInput
    1. DoOnce:
        a. 只會執行一次
        b. 當 Start Closed 勾選 或輸入 true 時, 需要執行 Reset 鍵才能執行一次

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

    2. DoOnce MultiInput:
        a. 與 DoOnce 類似, 只會執行一次   
        b. 支援多個輸入, 同時輸出:
             A In ---> A Out
             B In ---> B Out
             ......


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

D. N FlipFlop
     按 F 鍵, 第 1 次執行 A 的結果, 第 2 次執行 B 的結果, 依此循環下去.
    備註:  Is A 若為 true(目前在執行 A) 可執行其它的動作

    結果:

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

E. ForLoop 與 ForLoopWithBreak
   1. ForLoop
       從 First Index 執行到 Last Index

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

   2. ForLoopWithBreak
       與 ForLoop 類似,多一個 Break (true / false) 來判斷何時離開迴圈

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

F. Gate 與 MultiGate
   1. Gate:
       經由 Open / Close / Toggle 來決定: 從 EnterExit 是否可以執行

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


   2. MultiGate:
       與 Gate 類似,
       a. 在 Loop 為 false, Is Random 為 false 的情況下:
           會依序執行: Out 0, Out 1, Out 2 ... 然後停止.
           (Reset 後可以重新再執行)

       b. 在 Loop 為 false, Is Random 為 true 的情況下:
           會隨機執行不同的 Out 各一次, 然後停止.
           (Reset 後可以重新再執行)

       c. 在 Loop 為 true, 依照上方的規則循環執行.

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

G. Retriggerable Delay:
     與 Delay 類似, 但是會重新觸發 duration 的時間,
     如下所示, 如果持續在 3 秒內按 G 鍵, 則不會印出 Hello2

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

H. Sequence:
     依序執行

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

I. WhileLoop
   Conditiontrue 執行, 當為 false 時離開回圈

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

J. Switch
   1. Switch on Int
       當 Selection 的值與 pin 的值相同時, 執行所對應 pin 的動作.

    可設定 Start Index

    滑鼠右鍵刪除個別的 pin

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

   2. Switch on Name
       當 Selection 的值與 pin 的值相同時, 執行所對應 pin 的動作.

    可設定 Pin 的值

Unreal: Level Blueprint > Function

since: 2016/06/11
update: 2016/06/11

reference:
1. Unreal Engine 4 Documentation | Unreal Engine


A. 新增 Function
    1. Functions > +
        > 輸入 Function 名稱: WelcomeMessage

    2. 在 Function 的 Details 中新增 InputsOutputs:

    3. 結果: (多產生一個 Return Node, 用來回傳資料)

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

B. 新增 Append Function 來做字串串接:
    1. 幫 Append 函式增加合適的 pin 數量, 以提供字串串接的數量.

    2. 將從 WelcomeMessage 輸入的 FirstName 傳給 Append 函式

    3. 經 Append 函式串接後的結果(A + B + C: Return Value)
        傳給 Return NodeMessage 輸入

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

C. 進入遊戲關卡後, 印出問候訊息.
    1. 從 WelcomeMessageFunction Graph 切回換到 Event Graph

    2. 新增 WelcomeMessageEvent BeginPlay 執行

    3. 新增 PrintString 來處理 WelcomeMessage  輸出的結果.


    結果: 進入遊戲關卡, 顯示的訊息.

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

D. Pure Function:

    1. 定義: Functions that only depend on their parameters and not on any global state
                 are usually called pure functions.

    2. 回到 WelcomeMessageFunction Graph 裡, 點選 WelcomeMessage 後, 
        在 Details 裡將 Pure 打勾.

    2. 再回到 Event Graph 裡, 可以看到整個 Blueprint 的流程簡化

Unreal: Level Blueprint > Array

since: 2016/06/11
update: 2016/06/11
reference:
1. Unreal Engine 4 Documentation | Unreal Engine


A. Create Array

    1. 新增變數: MyInventory

    2. 在 Details 裡, 將變數種類改成: String , 並設為 array 型別

    3. 增加預設值:

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

B. 按下 "I" 鍵, 執行 ForEachLoop 功能:

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

C. 取得(Get) MyInventory 的 array 值, 輸入給  ForEachLoop 的 Array

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

D. 由  ForEachLoop 取得 Array 元素, 分別印出字串後, 停留 10 秒才消失.

    結果:  進入遊戲, 按下 "I" 鍵: Array 元素會從下往上疊上來

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

E. 新增要附加給 Array 的變數:

    1. 新增一個變數: NewItem, 設為 String 型態, 並給予預設值: potion


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

F. 附加元素給 MyInventory Array:
   1. 新增 AND Node
   2. 取得(get) NewItem 的值給 ADD node
   3. 將 ADD node 的值附加給  MyInventory Array
   4. AND node 執行結束後, 呼叫 Print String 函式, 顯示: "A potion added" 10


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

   G. 按下 "P" 鍵, 執行 ADD 功能:

    結果:  進入遊戲, 先按下 "P" 鍵: 顯示: "A potion added"
               , 接著再按 "I" 鍵: 列出所有元素.(多了 potion)

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

   H. Array 相關函式


2016年6月10日 星期五

Unreal: Level Blueprint > Variables

since: 2016/06/10
update: 2016/06/10

reference:
1. Unreal Engine 4 Documentation | Unreal Engine


A. Get Variables

     當進入此關卡, 開始計時 3 秒, 時間一到就離開遊戲.
---------------------------------------------------------------------

     新增 Float 變數: DelayDuration
     設定 Default Value: 3.0

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

B. Set Variables

     當進入此關卡, 開始計時 5 秒, 時間一到就離開遊戲.
---------------------------------------------------------------------

     新增 Float 變數: DelayDuration
     設定 Default Value: 3.0 (值會被之後的設定取代)
     進入關卡, 設定 DelayDuration  變數值: 5.0

Unreal: Level Blueprint > Quit Game

since: 2016/06/10
update: 2016/06/10
reference
:
1. Unreal Engine 4 Documentation | Unreal Engine


A. 說明:

     當進入此關卡, 開始計時 3 秒, 時間一到就離開遊戲.
   
     ---------------------------------------------------------------------

     打開 Level Blueprint:


     Blueprint Type:
     Level Blueprint

     Event:
     Event BeginPlay


     Function:
     Delay

     Quit Game


2016年6月8日 星期三

ColorPicker For Swift

since: 2016/06/08
update: 2016/06/08
reference:
1. johankasperi/SwiftHSVColorPicker
2. PrashantMangukiya/SwiftColorPicker
3. How to get the RGB Code (INT) from an UIColor in Swift - Stack Overflow


A. HSV Wheel Color Picker:
    1. 從
johankasperi/SwiftHSVColorPicker
        > 下載檔案: SwiftHSVColorPicker-master.zip
並解壓縮
        > 打開 SwiftHSVColorPickerExample.xcodeproj

    2. 修改: ViewController.swift 如下:
//
//  ViewController.swift
//  SwiftHSVColorPicker
//
//  Created by johankasperi on 2015-08-20.
//

//@add ####################
//
// Hue Saturation Value; HSV
//
// 係用一個倒六稜錐體定義顏色空間的模型。
// 其中,色調用H表示,以0到360度角表示各種顏色,如0度為紅色,120度為綠色。
// S為0與1間取值,反映顏色飽和或濃淡程度。
// V表示明度或亮度,在0與1間取值,0為最暗,1為最亮。


import Foundation
import UIKit
//@add ####################
import AudioToolbox

//@add ####################
extension UIColor {
    func rgb() -> (red:Int, green:Int, blue:Int, alpha:Int)? {
        var fRed : CGFloat = 0
        var fGreen : CGFloat = 0
        var fBlue : CGFloat = 0
        var fAlpha: CGFloat = 0
        if self.getRed(&fRed, green: &fGreen, blue: &fBlue, alpha: &fAlpha) {
            let iRed = Int(fRed * 255.0)
            let iGreen = Int(fGreen * 255.0)
            let iBlue = Int(fBlue * 255.0)
            let iAlpha = Int(fAlpha * 255.0)
           
            return (red:iRed, green:iGreen, blue:iBlue, alpha:iAlpha)
        } else {
            // Could not extract RGBA components:
            return nil
        }
    }
}


//@add ####################
extension Int
{
    func toString() -> String
    {
        let myString = String(self)
        return myString
    }
}


//@add ####################
extension CGFloat
{
    func toString() -> String
    {
        let myString = String(self)
        return myString
    }
}


class ViewController: UIViewController {
   
    // Init ColorPicker with yellow
    var selectedColor: UIColor = UIColor.whiteColor()
   
    // IBOutlet for the ColorPicker
    @IBOutlet var colorPicker: SwiftHSVColorPicker!
   
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        // Setup Color Picker
        colorPicker.setViewColor(selectedColor)
    }
   
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
    }
   
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
   
//    @IBAction func getSelectedColor(sender: UIButton) {
//        // Get the selected color from the Color Picker.
//        let selectedColor = colorPicker.color
//       
//        print(selectedColor)
//    }
   
    //@update  ####################
    @IBAction func getSelectedColor(sender: UIButton) {
        // Get the selected color from the Color Picker.
        // colorPicker.hue
        // colorPicker.saturation
        // colorPicker.brightness

        let selectedColor = colorPicker.color
        //print(selectedColor)
       
        AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
       
        if let rgb = selectedColor.rgb() {
            print()
            print(selectedColor)
            print("red = " + (rgb.red).toString())
            print("green = " + (rgb.green).toString())
            print("blue = " + (rgb.blue).toString())
            print("alpha = " + (rgb.alpha).toString())
            print("brightness = " + (colorPicker.brightness).toString())
        } else {
            print("conversion failed")
        }
    }

}

    3. 執行結果:



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

B. HSV Palette Color Picker:
    1. 從 PrashantMangukiya/SwiftColorPicker
        > 下載檔案: SwiftColorPicker-master.zip 並解壓縮
        > 打開 SwiftColorPicker \ SwiftColorPicker.xcodeproj

    2. 修改: ViewController.swift 如下:
//
//  ViewController.swift
//  SwiftColorPicker
//
//  Created by Prashant on 02/09/15.
//  Copyright (c) 2015 PrashantKumar Mangukiya. All rights reserved.
//
import UIKit

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate, ColorPickerDelegate {
   
    // outlet - selected color preview
    @IBOutlet var colorPreview: UIView!
   
    // outlet - change color button
    @IBOutlet var changeColorButton: UIButton!
   
    // action - called when change color button clicked
    @IBAction func changeColorButtonClicked(sender: UIButton) {
        self.showColorPicker()
    }
   
    // outlet - change color button placed at navigation bar (right side)
    @IBOutlet var changeColorButtonNav: UIBarButtonItem!
   
    // action - change color button placed at navigation bar (right side)
    @IBAction func changeColorButtonNavClicked(sender: UIBarButtonItem) {
        self.showColorPickerFromNavBar()
    }
   
    // class varible maintain selected color value
    var selectedColor: UIColor = UIColor.blueColor()
    var selectedColorHex: String = "0000FF"
   
    // MARK: - View functions
   
    // called after view loaded
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        // set corner radious
        self.colorPreview.layer.cornerRadius = self.colorPreview.layer.frame.width/6
       
        // set default background color
        self.colorPreview.backgroundColor = self.selectedColor
    }

    // called if received memory warning
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
   
    // MARK: Popover delegate functions

    // Override iPhone behavior that presents a popover as fullscreen.
    // i.e. now it shows same popover box within on iPhone & iPad
    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
       
        // show popover box for iPhone and iPad both
        return UIModalPresentationStyle.None
    }
   
    // MARK: Color picker delegate functions
    // called by color picker after color selected.
    func colorPickerDidColorSelected(selectedUIColor selectedUIColor: UIColor, selectedHexColor: String) {
      
        // update color value within class variable
        self.selectedColor = selectedUIColor
        self.selectedColorHex = selectedHexColor
       
        // set preview background to selected color
        self.colorPreview.backgroundColor = selectedUIColor
       
        //@add ############################################
        print("selectedColorHex = "+selectedColorHex)
    }
  
    // MARK: - Utility functions
    // show color picker from UIButton
    private func showColorPicker(){
       
        // initialise color picker view controller
        let colorPickerVc = storyboard?.instantiateViewControllerWithIdentifier("sbColorPicker") as! ColorPickerViewController
       
        // set modal presentation style
        colorPickerVc.modalPresentationStyle = .Popover
       
        // set max. size
        colorPickerVc.preferredContentSize = CGSizeMake(265, 400)
       
        // set color picker deleagate to current view controller
        // must write delegate method to handle selected color
        colorPickerVc.colorPickerDelegate = self
       
        // show popover
        if let popoverController = colorPickerVc.popoverPresentationController {
           
            // set source view
            popoverController.sourceView = self.view
           
            // show popover form button
            popoverController.sourceRect = self.changeColorButton.frame
           
            // show popover arrow at feasible direction
            popoverController.permittedArrowDirections = UIPopoverArrowDirection.Any
           
            // set popover delegate self
            popoverController.delegate = self
        }
       
        //show color popover
        presentViewController(colorPickerVc, animated: true, completion: nil)
    }
   
   
    // show color picker from Navigation Bar Button
    private func showColorPickerFromNavBar(){
       
        // initialise color picker view controller
        let colorPickerVc = storyboard?.instantiateViewControllerWithIdentifier("sbColorPicker") as! ColorPickerViewController
       
        // set modal presentation style
        colorPickerVc.modalPresentationStyle = .Popover
       
        // set max. size
        colorPickerVc.preferredContentSize = CGSizeMake(265, 400)
       
        // set color picker deleagate to current view controller
        // must write delegate method to handle selected color
        colorPickerVc.colorPickerDelegate = self
       
        // show popover
        if let popoverController = colorPickerVc.popoverPresentationController {
           
            // show popover from navigation bar button
            popoverController.barButtonItem = self.changeColorButtonNav
           
            // show popover arrow at feasible direction
            popoverController.permittedArrowDirections = UIPopoverArrowDirection.Any
           
            // set popover delegate self
            popoverController.delegate = self
        }
       
        // show color popover
        presentViewController(colorPickerVc, animated: true, completion: nil)
    }
}

    3. 執行結果: