fork download
  1. // ----- for Unity3D
  2.  
  3. // ■利用方法:
  4. //
  5. // … GameObjectに割り当てた、任意のコード上で
  6. // private AssemblyCSharp.Dat2chLoader datLoader = null;
  7. //
  8. // … Awake などで
  9. // datLoader = new AssemblyCSharp.Dat2chLoader();
  10. // datLoader.asyncLoad("http://t...content-available-to-author-only...h.net/test/read.cgi/gamedev/1324187203/");
  11. //
  12. //  ※試しに、このスレ「Unity 7ウニ目」http://t...content-available-to-author-only...h.net/test/read.cgi/gamedev/1324187203/
  13. //
  14. // … OnGUI などで
  15. // if(datLoader.isLoaded)
  16. // {
  17. // GUI.TextField(new Rect(32, 32+64, 200, 150), datLoader.getRes(0));
  18. // }
  19.  
  20. using System;
  21. using System.IO;
  22. using System.Net;
  23. using System.Text;
  24. using System.Collections;
  25. using System.Threading;
  26. using System.Text.RegularExpressions;
  27.  
  28. namespace AssemblyCSharp
  29. {
  30. // 2chスレロードクラス。ただのローダなので MonoBehaviour 継承不要
  31. public class Dat2chLoader
  32. {
  33. // 2chスレのURL → datのURL変換用
  34. private const String PAT_2CH = @"^h?ttp:\/\/([^\/]+)\/test\/read\.cgi\/([^\/]+)\/([0-9]+)\/?$";
  35. private const String PAT_DAT = "http://{0}/{1}/dat/{2}.dat";
  36.  
  37. delegate void OnLoad(String s);
  38. private OnLoad onLoad = null;
  39.  
  40. private Regex reg = null;
  41. private bool bRun = false;
  42.  
  43. private String[] arText = null;
  44.  
  45. // 唯一のコンストラクタ
  46. public Dat2chLoader()
  47. {
  48. reg = new Regex(PAT_2CH);
  49. onLoad = this.done;
  50. }
  51.  
  52. // 非同期ローダ
  53. public bool asyncLoad(String sUrl)
  54. {
  55. // 一応 re-run 対策
  56. if(bRun) return false;
  57.  
  58. Match m = reg.Match(sUrl);
  59. if(m==null || m.Length<2) return false;
  60.  
  61. String sDatUrl = String.Format(PAT_DAT, m.Groups[1], m.Groups[2], m.Groups[3]);
  62. //UnityEngine.Debug.Log(sDatUrl);
  63.  
  64. // 子スレッド起こしてロード
  65. Thread th = new Thread(new ThreadStart(delegate() {
  66.  
  67. // 要はインターネットからリソースロードする、普通の処理
  68. try {
  69. HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sDatUrl);
  70. HttpWebResponse res = (HttpWebResponse)req.GetResponse();
  71.  
  72. String sTmp = null;
  73. StreamReader sr = null;
  74. using(
  75. sr = new StreamReader(
  76. res.GetResponseStream(), Encoding.Default
  77. )
  78. ){
  79. sTmp = sr.ReadToEnd();
  80. }
  81.  
  82. // デリゲートメソッドに渡すにあたって、障害時の切り分け用に、
  83. // usingブロック外で通知
  84.  
  85. onLoad(sTmp);
  86. } catch(Exception e) {
  87.  
  88. // 一応、大雑把なエラーハンドリング
  89. onLoad("-- error --:" + e.Message);
  90. }
  91.  
  92. }));
  93. th.Start();
  94.  
  95. return bRun = true;
  96. }
  97.  
  98. // 終了が通知されるメソッド ※外部から叩かれても困るので private
  99. private void done(String s)
  100. {
  101. arText = s.Split('\n');
  102. bRun = false;
  103. }
  104.  
  105. // ロード完了してるか?
  106. public bool isLoaded { get { return arText != null; } }
  107.  
  108. // ロードされたスレのレス数はいくつ?
  109. public int length { get { return arText != null? arText.Length: 0; }}
  110.  
  111. // 適当な文字列の取得メソッド(スレの最初のレス)。適宜変更を
  112. public String getRes(int index)
  113. {
  114. return arText[index];
  115. }
  116. }
  117.  
  118. }
  119.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty