2019年6月29日 星期六

Unity 學習筆記 - UGUI 滑動式關卡選擇製作

1. 範例截圖如下,可上下滑動
2. Hierarchy 結構如下,皆為Image UI
3. SlideBg添加組件ScrollRectMask組件,並將BeSlided拉至content中,如下圖。
4. BeSlided添加Grid Layout Group組件,可格狀排列。

2019年6月23日 星期日

Unity 學習筆記 - 手機實機 debug 除錯(Android)


1. 將手機與電腦透過傳輸線連接,並連線於同一個 Wi-Fi

2. 開啟 Build Setting ,將 Development Build 打勾

3. sdk 安裝的路徑下開啟 monitor,路徑如: C:\Users\user\AppData\Local\Android\Sdk\tools\lib\monitor-x86_64\monitor.exe

Unity 學習筆記 - 手機螢幕獲取觸碰座標


直接上程式碼

private void FixedUpdate()
    {
        if (Input.touchCount > 0)
        {
            // 獲取觸碰點的座標(此為螢幕座標)
            float x_touch_position = Input.GetTouch(0).position.x;
            float y_touch_position = Input.GetTouch(0).position.y;
        }
    }

Unity 學習筆記 - 放置Admob廣告


關於如何在unity 中加入Admob廣告,在官方網站其實有很詳細的說明,請參照Mobile Ads SDK (Unity)
1. 下載插件
2. import GoogleMobileAdsPlugin.unitypackage (即下載下來的插件)
3. 建立一腳本 ShowGoogleAds.cs 掛在一物件上,即可成功顯示廣告
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleMobileAds.Api;

public class ShowGoogleAds : MonoBehaviour {
    private BannerView bannerView;

    // Use this for initialization
    void Start () {
        // google ad
        #if UNITY_ANDROID
            string appId = "xx-xxx-xxx-xxxxxxxxxxxxxxxx~xxxxxxxxxx";
        #elif UNITY_IPHONE
            string appId = " xx-xxx-xxx-xxxxxxxxxxxxxxxx~xxxxxxxxxx ";
        #else
            string appId = "unexpected_platform";
        #endif

        // Initialize the Google Mobile Ads SDK.
        MobileAds.Initialize(appId);
        this.RequestBanner();
    }
    
     // Update is called once per frame
     void Update () {
         
     }

    private void RequestBanner()
    {
        // 這是測試id
        //ca-app-pub-3940256099942544/6300978111

        #if UNITY_ANDROID
            string adUnitId = "xx-xxx-xxx-xxxxxxxxxxxxxxxx/xxxxxxxxxx";
        #elif UNITY_IPHONE
            string adUnitId = " xx-xxx-xxx-xxxxxxxxxxxxxxxx/xxxxxxxxxx ";
        #else
            string adUnitId = "unexpected_platform";
        #endif

        // Create a banner at the top of the screen.
        bannerView = new BannerView(adUnitId, AdSize.SmartBanner, AdPosition.Bottom);

        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder().Build();

        // Load the banner with the request.
        bannerView.LoadAd(request);
    }
}


Unity 學習筆記 - 音效播放


1. 添加 Audio Source 組件,並將聲音檔拉至 AudioClip

2. 於掛在同一物件上的腳本控制播放聲音
// Use this for initialization
    void Start () {
        audioSource = GetComponent<AudioSource>();
    }
public void Test()
    {
        audioSource.Play();
    }

2019年6月22日 星期六

Unity 學習筆記 - 根據觸碰點施加不同方向的力


直接上程式碼

private Rigidbody2D m_rigidbody2D;

// Use this for initialization
    void Start () {
        m_rigidbody2D = GetComponent<Rigidbody2D>();
    }

private void FixedUpdate()
    {
        if (Input.touchCount > 0 && flag)
        {
            // 獲取觸碰點的座標(此為螢幕座標)
            float x_touch_position = Input.GetTouch(0).position.x;
            float y_touch_position = Input.GetTouch(0).position.y;

            // 世界座標轉換為螢幕座標 ()
            Vector3 tempPosition = Camera.main.WorldToScreenPoint(m_rigidbody2D.transform.position);

            // 欲施加的 X 方向向量
            float vx = x_touch_position - tempPosition.x;

            // 欲施加的 Y 方向向量
            float vy = y_touch_position - tempPosition.y;

            if (vx >=0 && vy>=0)
            {
                myAngle = Vector2.Angle(new Vector2(0, 1), new Vector2(vx, vy));
                m_rigidbody2D.rotation = 90f - myAngle;
                m_rigidbody2D.AddRelativeForce(Vector2.right * speed);
                flag = false;
            }
            else if (vx < 0 && vy >= 0)
            {
                myAngle = Vector2.Angle(new Vector2(0, 1), new Vector2(vx, vy));
                m_rigidbody2D.rotation = 90f + myAngle;
                m_rigidbody2D.AddRelativeForce(Vector2.right * speed);
                flag = false;
            }
        }
    }

Unity 學習筆記 - 國際化(多國語言)(語言切換)


1. Assets 新增一 Folder 並命名為 Resources,並準備不同語言之txt檔案放入其中

2. 檔案內容範例如下

3. 新增腳本 LanguageMgr.cs
public class LanguageMgr : MonoBehaviour
{
    private static LanguageMgr instance = null;
   
    public static LanguageMgr Instance
    {
        get { return instance; }
    }

    [SerializeField]
    private SystemLanguage language;

    private Dictionary<string, string> dict = new Dictionary<string, string>();

    private void loadLanguage()
    {
        // 根據手機系統語言變換語言
        if (Application.systemLanguage == SystemLanguage.ChineseTraditional)
        {
            language = SystemLanguage.ChineseTraditional;
        }
        else if (Application.systemLanguage == SystemLanguage.ChineseSimplified)
        {
            language = SystemLanguage.ChineseSimplified;
        }
        else if (Application.systemLanguage == SystemLanguage.English)
        {
            language = SystemLanguage.English;
        }
        else
        {
            language = SystemLanguage.English;
        }
        //加载文件
        TextAsset ta = Resources.Load<TextAsset>(language.ToString());

        if (ta == null)
        {
            Debug.LogWarning("沒有這個語言的翻譯文件");
            return;
        }

        //獲取每一行
        string[] lines = ta.text.Split('\n');
        //獲取 key value
        for (int i = 0; i < lines.Length; i++)
        {
            //檢測
            if (string.IsNullOrEmpty(lines[i]))
                continue;
            //獲取 key:kv[0] value kv[1]
            string[] kv = lines[i].Split(':');
            //保存到字典
            dict.Add(kv[0], kv[1]);

            Debug.Log(string.Format("key:{0}, value:{1}", kv[0], kv[1]));
        }
    }

    void Awake()
    {
        instance = this;

        loadLanguage();
    }

   
    public string GetText(string key)
    {
        if (dict.ContainsKey(key))
            return dict[key];
        else//沒有這個 key
        {
            return string.Empty;
        }
    }
}

4. LanguageMgr.cs 腳本掛到 Canvas 上,可看見各語言名稱

5. 新增腳本 UIText.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UIText : MonoBehaviour
{
    /// <summary>
    /// 對應的key
    /// </summary>
    [SerializeField]
    private string key;

    void Start()
    {
        //設置key之后 才需要改变
        if (!string.IsNullOrEmpty(key))
        {
            //獲取對應的value
            string value = LanguageMgr.Instance.GetText(this.key);
            if (!string.IsNullOrEmpty(value))
                //text组件赋值
                GetComponent<Text>().text = value;
        }
    }
}

6. UIText.cs 掛到欲國際化的 Text 組件上,並輸入 key 值,即可實現國際化。


[Android][App] Pin Poke Challenge 隱私權保護政策

非常歡迎您使用「 Pin Poke Challenge 」,為了讓您能夠安心使用此 App 的各項服務與資訊,特此向您說明 Pin Poke Challenge的隱私權保護政策,以保障您的權益,請您詳閱下列內容: 一、隱私權保護政策的適用範圍 隱私權保護政策內容,包括...