2016年2月14日 星期日

【分享】Unity判斷是PC/手機/平板/iOS/Android 平台


這個可以判斷是iphone/ipad 以及 android手機或7吋以上

由於如果開發中會針對不同平台做不同處理

就可以用官方文件提供的方法來選擇不同的code

像是開發的時候常常會需要在PC(IDE上)跟目標平台不斷測試與切換就會用到

例如在PC上是mouseClick,在移動裝置上是touch



先直接上Code:
///Check the current device is tablet or not
private void checkTheCurrentDevice()
{
#if UNITY_IPHONE
string deviceModel = SystemInfo.deviceModel.ToLower().Trim();
if(deviceModel.StartsWith("ipad"))
{
bIsTablet = true;
}
else
{
bIsTablet = false;
}
#elif UNITY_ANDROID

float physicScreenSize = Mathf.Sqrt(Screen.width * Screen.width + Screen.height * Screen.height) / Screen.dpi;

if(physicScreenSize >= 7f) //If the screen size is >= 7 inches, it‘s a tablet

{
bIsTablet = true;
}

else
{
bIsTablet = false;
}

#else
bIsTablet = false;
#endif
// bIsTablet = false;
}

此外Unity官方文件有提供判斷不同平台的方法
http://docs.unity3d.com/Manual/PlatformDependentCompilation.html
簡易範例:
#if UNITY_EDITOR
    Debug.Log("Unity Editor");

#elif UNITY_IPHONE
    Debug.Log("Unity iPhone");

#else
    Debug.Log("Any other platform");

#endif
來源與補充:
http://www.tqcto.com/article/mobile/135196.html

http://www.lxway.com/422815844.htm

【分享】Unity判斷是PC/手機/平板/iOS/Android 平台


這個可以判斷是iphone/ipad 以及 android手機或7吋以上

由於如果開發中會針對不同平台做不同處理

就可以用官方文件提供的方法來選擇不同的code

像是開發的時候常常會需要在PC(IDE上)跟目標平台不斷測試與切換就會用到

例如在PC上是mouseClick,在移動裝置上是touch



先直接上Code:
///Check the current device is tablet or not
private void checkTheCurrentDevice()
{
#if UNITY_IPHONE
string deviceModel = SystemInfo.deviceModel.ToLower().Trim();
if(deviceModel.StartsWith("ipad"))
{
bIsTablet = true;
}
else
{
bIsTablet = false;
}
#elif UNITY_ANDROID

float physicScreenSize = Mathf.Sqrt(Screen.width * Screen.width + Screen.height * Screen.height) / Screen.dpi;



if(physicScreenSize >= 7f) //If the screen size is >= 7 inches, it‘s a tablet



{



bIsTablet = true;



}



else



{



bIsTablet = false;



}



#else



bIsTablet = false;



#endif





// bIsTablet = false;



}









此外Unity官方文件有提供判斷不同平台的方法
http://docs.unity3d.com/Manual/PlatformDependentCompilation.html
簡易範例:
#if UNITY_EDITOR
    Debug.Log("Unity Editor");

#elif UNITY_IPHONE
    Debug.Log("Unity iPhone");

#else
    Debug.Log("Any other platform");

#endif
來源與補充:
http://www.tqcto.com/article/mobile/135196.html

http://www.lxway.com/422815844.htm

【研究中】OnClick 與 Scroll / Drag 更精準的判斷


問題點:假設Menu中有多個Button,而Button是在一個Scroll Rect上可以滾動Menu
要如何解決使用者想要點按鈕但拖曳滾動(Scroll)選單過於靈敏而造成的誤判。

解法:將Click判斷更容易或是將Scroll觸發靈敏度降低

1.讓Click判斷更容易:目前的方法是假設觸發Down(按下)的時候紀錄位置,在Up(起來)時判斷位移,假設低於參數,則視為Click事件
優點:假設使用者想觸發按鈕,但卻略有位移會觸發Scroll,但同時也可以觸發Click達成目的
缺點:因為Scroll跟Click會同時觸發,這樣體驗上並不夠完善

2.讓Scroll靈敏度降低,可能要直接重寫Scroll方法掛在UI上,如果是直接調用的話,目前暫無解決的思路。

Code(C#)

//增強Click判定(在此觸控位移距離內都算是Click事件,以避免使用者想Click選單卻誤判為Scroll)
public float ClickJudgeDistance = 10;

public void OnPointerDown( PointerEventData eventData)
{
m_screenPos = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
}

public void OnPointerUp( PointerEventData eventData ){
        Vector2 pos = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
float dis = Vector2.Distance (pos, m_screenPos);
if(dis < ClickJudgeDistance ){
onClickDelegate();

}
}

2016年1月19日 星期二

【實作】可拖曳式UI - Draggable UI (UGUI)


適用情境:實作一個如虛擬Home鍵 / Facebook訊息APP頭像 的按鈕(可拖曳與觸發點擊)
C#

public void OnDrag(){ transform.position = (Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,100))); //滑鼠 if(Input.touchCount>0&& Input.GetTouch(0).phase==TouchPhase.Moved) { Ray ray = Camera.main.ScreenPointToRay(Input.touches[0].position); //觸控 } }
將上述Script丟進要拖曳的UI中
新增Event Trigger,點Add New Event Type,選Drag事件
將UI自己拖進Object中,右邊選剛剛的Script名稱跟OnDrag方法
若是需要同時具備OnClick跟Drag事件,也就是同一個UI具備兩種觸發則需要
新增Canvas Group
Event Trigger新增Begin Drag與End Drag
Begin中選禁用互動(interactable)功能(就是下面框框不要打勾)
End中選開啟互動(interactable)功能(下面框框打勾)

不過也可以直接禁用或開啟上方Button的互動功能,這邊是有另外需求才採用Canvas Group

2016年1月11日 星期一

【實作】滑鼠/鼠標/觸控點擊特效系統


【適用情境】當專案需要滑鼠/觸控點擊的時候產生一個粒子效果


有2種呈現方法
1.常駐型粒子效果,適用於滑鼠
2.點擊/觸控產生粒子效果並隔數秒後銷毀


【法1】
1.創建一個粒子系統(particle system),或導入現成的粒子prefab
2.將以下Script導入粒子系統物件上

[C#]
public float Distance = 10;
void Update(){
Ray effect_ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Vector3 pos = effect_ray.GetPoint(Distance);
transform.position = pos;

【法2】

這邊參考了Caz的用法,雖然上面說會自動銷毀,但實際測試好像不會就加入了Destroy
[Unityscript]
#pragma strict
var MyEffect:GameObject ;
var hit : RaycastHit;
var cooldown : float;
private var effect:GameObject;
private var g_camera : Camera;
private var g_camTransform : Transform;

function Awake()
{
   g_camera = Camera.main;
   g_camTransform = g_camera.transform;
}

function Update ()
{
 if(cooldown>0){cooldown-=Time.deltaTime;}
 var mousePos = Input.mousePosition;

 var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
 var vecMousePosition = g_camera.ScreenToWorldPoint(Vector3(mousePos.x, mousePos.y-15,20));

 if(Input.GetMouseButton(0) &&cooldown<=0)
 {
  effect=Instantiate(MyEffect, vecMousePosition , Quaternion.identity);
  cooldown=0.15;
  Destroy(effect,0.4);
 } 
}

2016.01.14補充:
此方法其實還需要調整一些東西,不然生成的prefab會在UI後方
但一般來說點擊的效果都是在最前面的
解決方案是在Canvas上調整Render Moder改成Camera模式
然後Main camera丟進去後,產生的prefab就可以調整到UI前面了


2016年1月10日 星期日

【翻譯】Unity官方教學 - UI EVENTS AND EVENT TRIGGERS(UGUI)



翻譯:
場景中的UI常常會有很多互動,而使用者輸入和UI元素則是由Event(事件)控制
當Canvas加入後,EventSystem(事件系統)物件也會被加入,這個gameobject包含事件系統組件以及各種輸入模組,當一個場景開始事件系統,他就會檢測輸入的對象,根據檢測到的模組,以及確定輸入與UI元素之間的關係
Event System中的屬性
First Selected(第一選定對象)可以指定預設切換到本場景的第一個UI為選定狀態
這裡我們來指定一個按鈕,隨後啟動場景之後,會看到按鈕顏色略有不同,這代表按鈕處於被選取的狀態這裡常是按下空白鍵,按鈕就會呈現被按下的狀態,無須用滑鼠點擊,這是不用滑鼠或控制器,這常用於創建菜單系統

Input Module(輸入模組)
一開始輸入模組默認有兩組,一組是滑鼠/鍵盤/遊戲手把,另一組是觸控輸入
Standalone(獨立)輸入模組中,有Submit Button(提交)和Cancel(取消)按鈕
在Input Actions per second中可以調整接收輸入訊號的頻率,每秒輸入動作,預設是10也就是每秒可接受10個輸入訊號,代表兩個輸入之間有0.1秒的延遲
Allow Activation On Mobile是允許在行動裝置上使用(→這個在5.0之後好像沒該選項)

*此處還多了兩個選項,Repeat Delay(重複延遲) 跟 Force Module Active(強制模組驅動),而後者我想應該跟Allow Activation On Mobile是類似的選項,只是有改名字而已

Touch(觸控)輸入模組中,有Allow Activation On Standalone(5.0也改成 Force Module Active)
代表觸控的輸入也可以在獨立模式中驅動

在Button中有Onclick()事件,可以按"+"新增事件,onclick本身也由移動到button上、點擊、放開等組成,而在image中並沒有觸發事件,不過可以在屬性欄新增Event>Event Trigger來驅動
教學中是選PointerEnter,然後一樣是按"+"新增事件對象,再把對象拖曳到上面,而旁邊的function則可以選取很多種預設的功能模組,這裡也可以調用自己編寫的Script的function,該函數類型是public(公共),返回值是void(空),函數必須是以下幾個型態,int/float/string/object reference

2016年1月8日 星期五

【翻譯】Unity官方教學 - UI Imgae (UGUI)


圖像(Imgae)組件是一個顯示在螢幕的可視化UI元素,可用於Button、Panel、Slider上
Source Image是圖片來源
Color是圖像的顏色,可以調節色度、明暗、透明度
Material(紋理),通常是none沒有紋理
Image Type:預設是Simple,會延伸到RectTransform的大小
               Sliced(切片):將圖片切成9等份;會多出一個fill center選項可以填充中心
               Tiled(磁磚):則會重複顯示圖片像是磁磚一樣
               Filled(填滿):則會將圖片填滿整個image物件;會多出fill method(填充法)跟 origin(填                                        充原點),Fill Amount則是填充的量,Clockwise則是順時鐘,類似車速表
Preserve Aspect:保留長寬比,勾選的話,調整大小按鈕會保留比例
Set Native Size:則是設定原始來源大小

Popular Posts