2017年4月10日 星期一

Unity內使用C#來Email寄信

現在用程式發Email這種事已基本到是一種必備功能了,但我就是沒有去實做過,所以趁這次工作上有需要用,借助Google大神的力量,自己也成功地在Unity內手動寄出第一封Mail,趕快記錄一下寫法。

我是以自己的Gmail做寄信人,所以SmtpClient的部分是參考用Gmail時的寫法,用其他家的Mail時設定都會不一樣的樣子。
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using System.Net;
  5. using System.Net.Mail;
  6.  
  7. public class EmailController : MonoBehaviour {
  8.  
  9.     void Start ()
  10.     {
  11.     }
  12.  
  13.     void Update ()
  14.     {
  15.     }
  16.  
  17.     void EmailAction()
  18.     {
  19.         MailMessage mailMessage = new MailMessage ();
  20.         SmtpClient smtpClient = new SmtpClient ("smtp.gmail.com");
  21.         Attachment attachment = new Attachment (@"Assets/A.png");    //指定要夾帶的物件路徑
  22.  
  23.         mailMessage.From = new MailAddress ("寄信人信箱", "寄信人名字", System.Text.Encoding.UTF8);
  24.         mailMessage.To.Add ("收信人信箱1");
  25.         mailMessage.To.Add ("收信人信箱2");
  26.         mailMessage.CC.Add ("收信人信箱3");
  27.         mailMessage.Bcc.Add ("收信人信箱4");
  28.  
  29.         mailMessage.Subject = "送給你一張好圖片";
  30.         mailMessage.Body = "這是我精挑細選、要送給你的一張好圖片。";
  31.         mailMessage.SubjectEncoding = System.Text.Encoding.UTF8;
  32.         mailMessage.BodyEncoding = System.Text.Encoding.UTF8;
  33.         mailMessage.Attachments.Add (attachment);
  34.         mailMessage.Priority = MailPriority.High;
  35.  
  36.         smtpClient.Port = 587;
  37.         smtpClient.Credentials = new System.Net.NetworkCredential ("寄信人信箱", "寄信人信箱密碼") as ICredentialsByHost;
  38.         smtpClient.EnableSsl = true;
  39.  
  40.         ServicePointManager.ServerCertificateValidationCallback = delegate(object sender,                  
  41.                                         System.Security.Cryptography.X509Certificates.X509Certificate certificate,
  42.                                         System.Security.Cryptography.X509Certificates.X509Chain chain,
  43.                                         System.Net.Security.SslPolicyErrors sslPolicyErrors)
  44.                                         {
  45. return true;
  46. };
  47.  
  48.         smtpClient.Send (mailMessage);
  49.  
  50.         Debug.Log ("寄信完成!!");
  51.     }
  52. }
在使用此方式時,作為SMTP的信箱帳戶必須要將安全防護性降低,才能順利寄出信件。

2017年4月5日 星期三

Unity內使用C#清除暫存記憶體的方式

最近在做專案時,忘記了加入釋放記憶體的機制,導致程式開了幾個小時就會當掉,故在此為粗心的自己記錄所知的釋放方式;這些方式有的是正規、有的是經驗、有的還是自己亂七八糟的觀念,所以不敢說絕對正確,主要是當需要釋放記憶體時,可用這些資訊作為起頭,直接使用或是以此去尋找更完整的資訊。

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

首先是一般使用的情況:
  1. GameObject x = GameObject.Find( "cube" );
  2. x = null;
藉由設為null而釋放掉x。

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

使用Unity內的WWW方式下載物件時:
  1. WWW wwwObject;
  2.  
  3. wwwObject.Dispose();
  4. wwwObject = null;
--------------------------------------------------------------------------------------------------------

使用Resources載入物件時:
  1. Resources.UnloadUnusedAssets ();
--------------------------------------------------------------------------------------------------------

使用GC機制時,單純的方式:
  1. GC.Collect();
依照現有的所有層代來逐一釋放:
  1. for( int k = 0; k <= GC.MaxGeneration; k++ )
  2. {
  3.   GC.Collect (k);
  4.   GC.WaitForPendingFinalizers ();
  5. }
關於GC.Collect的說明:
https://msdn.microsoft.com/zh-tw/library/y46kxc5e(v=vs.85).aspx

關於GC.WaitForPendingFinalizers的說明:
https://msdn.microsoft.com/zh-tw/library/system.gc.waitforpendingfinalizers(v=vs.110).aspx

有一點在意的地方是,網路上有人說若是GC.Collect()使用頻繁過多,會造成效能過度消耗和程式變得奇怪運作。

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

GC機制還有一種使用方式:
  1. public void Dispose()
  2. {
  3.   Dispose(true);
  4.   GC.SuppressFinalize(this);
  5. }
關於GC.SuppressFinalize的說明:
https://msdn.microsoft.com/zh-tw/library/ms182269.aspx

當在看說明時,會發現此方式會有正確和不正確的情況,但是看Mircosoft官方的範例會注意到差別只有在不正確為GC.SuppressFinalize(true);,而正確為GC.SuppressFinalize(this);這兩個地方。

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

最後是Mircosoft官方對於自動記憶體管理的說明,簡單來講是設定變數為null和使用GC.Collect():
https://msdn.microsoft.com/zh-tw/library/aa691138(v=vs.71).aspx