{"id":195,"date":"2017-09-22T12:37:28","date_gmt":"2017-09-22T03:37:28","guid":{"rendered":"http:\/\/uniblo.biz\/?p=195"},"modified":"2018-04-12T07:07:09","modified_gmt":"2018-04-11T22:07:09","slug":"chapter8_chat","status":"publish","type":"post","link":"https:\/\/uniblo.biz\/unity\/mmogame\/chapter8_chat","title":{"rendered":"Unity\u30aa\u30f3\u30e9\u30a4\u30f3\u30b2\u30fc\u30e0\u4f5c\u6210\u3010Chapter8\u3011\u30c1\u30e3\u30c3\u30c8\u306e\u5c0e\u5165"},"content":{"rendered":"
\u4eca\u56de\u306f\u30aa\u30f3\u30e9\u30a4\u30f3\u30b2\u30fc\u30e0\u306e\u4e00\u756a\u5927\u4e8b\u306a\u8981\u7d20\u3068\u3082\u8a00\u3048\u308b\u30c1\u30e3\u30c3\u30c8\u3092\u4f5c\u6210\u3057\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n
\u30c1\u30e3\u30c3\u30c8\u6a5f\u80fd\u81ea\u4f53\u306fPhoton\u306e\u30b9\u30af\u30ea\u30d7\u30c8\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u308b\u306e\u3067\u5b9f\u306f\u3068\u3066\u3082\u7c21\u5358\u306b\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002<\/p>\n
\u5c0e\u5165\u624b\u9806\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\u3002<\/p>\n
\u4ee5\u4e0a\u306e\u624b\u9806\u3067\u4ee5\u4e0b\u306e\u753b\u50cf\u306e\u3088\u3046\u306a\u3068\u308a\u3042\u3048\u305a\u52d5\u304f\u30c1\u30e3\u30c3\u30c8\u6a5f\u80fd\u304c\u5c0e\u5165\u3055\u308c\u307e\u3059\u3002<\/p>\n
<\/a><\/p>\n \u3057\u304b\u3057\u3053\u306e\u307e\u307e\u3060\u3068\u80cc\u666f\u8272\u306b\u3088\u3063\u3066\u306f\u30c1\u30e3\u30c3\u30c8\u306e\u6587\u5b57\u304c\u975e\u5e38\u306b\u898b\u3065\u3089\u3044\u306e\u3067InRoomChat\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u6539\u5909\u3057\u3066\u3001\u7c21\u6613\u306a\u30c1\u30e3\u30c3\u30c8UI\u3092\u4f5c\u6210\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n InRoomChat\u3092\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u66f8\u304d\u63db\u3048\u307e\u3057\u3087\u3046\u3002<\/p>\n \u203bInChatRoom.cs\u3067\u30a8\u30e9\u30fc\u304c\u51fa\u3066\u3044\u305f\u3088\u3046\u306a\u306e\u3067\u8a02\u6b63\u3057\u307e\u3057\u305f(2018\/4\/12)<\/strong><\/span><\/p>\n <\/p>\n \u30d7\u30ed\u30b0\u30e9\u30e0\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3060\u3051\u3067\u306f\u3069\u306e\u3088\u3046\u306bUI\u69cb\u9020\u3092\u4f5c\u6210\u3057\u3066\u3044\u308b\u304b\u5206\u304b\u308a\u306b\u304f\u3044\u304b\u3082\u3057\u308c\u306a\u3044\u306e\u3067\u4ee5\u4e0b\u306e\u753b\u50cf\u3092\u4f7f\u3063\u3066\u5c11\u3057\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n \u8d64\u8272\u3067\u56f2\u3093\u3060\u90e8\u5206<\/span><\/strong>\u304c\u30c1\u30e3\u30c3\u30c8UI\u30a6\u30a4\u30f3\u30c9\u30a6\u306e\u5782\u76f4\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u30b0\u30eb\u30fc\u30d7\u306b\u306a\u308a\u307e\u3059\u3002\u3064\u307e\u308aUI\u306e\u69cb\u9020\u8981\u7d20\u3092\u9806\u756a\u306b\u7e26\u306b\u4e26\u3079\u308b\u30b0\u30eb\u30fc\u30d7\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n \u9752\u8272\u3067\u56f2\u3093\u3060\u90e8\u5206<\/strong><\/span>\u304c\u30c1\u30e3\u30c3\u30c8\u30ed\u30b0\u8868\u793a\u3059\u308b\u305f\u3081\u306e\u30b9\u30af\u30ed\u30fc\u30eb\u30d3\u30e5\u30fc\u3068\u30d5\u30ec\u30ad\u30b7\u30d6\u30eb\u30b9\u30da\u30fc\u30b9\u3068\u306a\u308a\u307e\u3059\u3002\u3053\u3053\u306b\u53d7\u4fe1\u3057\u305f\u30c1\u30e3\u30c3\u30c8\u306e\u5185\u5bb9\u304c\u6d41\u308c\u307e\u3059\u3002<\/p>\n \u9ec4\u8272\u3067\u56f2\u3093\u3060\u90e8\u5206<\/span><\/strong>\u304c\u6c34\u5e73\u306e\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u30b0\u30eb\u30fc\u30d7\u3067UI\u306e\u69cb\u9020\u8981\u7d20\u3092\u9806\u756a\u306b\u6a2a\u306b\u4e26\u3079\u307e\u3059\u3002\u3053\u3053\u3067\u306f\u5165\u529b\u30d5\u30a3\u30fc\u30eb\u30c9\u3068\u7bc4\u56f2\u30fb\u5168\u4f53\u30c1\u30e3\u30c3\u30c8\u306e\u30dc\u30bf\u30f3\u3092\u6a2a\u306b\u4e26\u3079\u3066\u3044\u307e\u3059\u3002<\/p>\n \u7167\u3089\u3057\u5408\u308f\u305b\u306a\u304c\u3089\u3001\u9806\u756a\u3092\u5909\u3048\u3066\u8868\u793a\u3057\u3066\u3044\u305f\u3060\u304f\u3068\u3001\u3088\u308a\u69cb\u9020\u304c\u308f\u304b\u308b\u3068\u601d\u3044\u307e\u3059\u306e\u3067\u3084\u3063\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n <\/p>\n <\/a><\/p>\n\u7c21\u6613\u30c1\u30e3\u30c3\u30c8\uff35\uff29\u306e\u5b9f\u88c5<\/h2>\n
InRoomChat.cs\u306e\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9<\/h3>\n
using System.Collections.Generic;\r\nusing UnityEngine;\r\nusing System.Collections;\r\n[RequireComponent(typeof(PhotonView))]\r\npublic class InRoomChat : Photon.MonoBehaviour\r\n{\r\n #region \u5909\u6570\u5ba3\u8a00\r\n \/\/\u7bc4\u56f2\u30c1\u30e3\u30c3\u30c8\u5b9f\u88c5\u306e\u305f\u3081\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3001\u5909\u6570\u5b9a\u7fa9\r\n GameObject[] players; \/\/\u5168\u3066\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u30ad\u30e3\u30e9\u53d6\u5f97\u7528\r\n GameObject sender; \/\/\u9001\u4fe1\u30ad\u30e3\u30e9\u53d6\u5f97\u7528\r\n GameObject myPlayer; \/\/\u81ea\u5206\u306e\u30ad\u30e3\u30e9\u53d6\u5f97\u7528\r\n GUIStyle ChatStyle = new GUIStyle(); \/\/\u7bc4\u56f2\u30c1\u30e3\u30c3\u30c8Style\r\n GUIStyleState ChatStyleState = new GUIStyleState();\r\n GUIStyle AllChatStyle = new GUIStyle(); \/\/\u5168\u4f53\u30c1\u30e3\u30c3\u30c8Style\r\n GUIStyleState AllChatStyleState = new GUIStyleState();\r\n public Rect GuiRect = new Rect(0, 0, 300, 200); \/\/\u30c1\u30e3\u30c3\u30c8UI\u306e\u5927\u304d\u3055\u8a2d\u5b9a\u7528\r\n public bool IsVisible = true; \/\/\u30c1\u30e3\u30c3\u30c8UI\u8868\u793a\u975e\u8868\u793a\u30d5\u30e9\u30b0\r\n public bool AlignBottom = true;\r\n public List<string> messages = new List<string>(); \/\/\u30c1\u30e3\u30c3\u30c8\u30ed\u30b0\u683c\u7d0d\u7528List\r\n public List<bool> chatKind = new List<bool>(); \/\/\u30c1\u30e3\u30c3\u30c8\u30ed\u30b0\u306e\u7a2e\u985e\u683c\u7d0d\u7528(\u7bc4\u56f2\u30c1\u30e3or\u5168\u30c1\u30e3)\r\n public string inputLine = \"\";\/\/\u5165\u529b\u6587\u7ae0\u683c\u7d0d\u7528String\r\n private Vector2 scrollPos = Vector2.zero; \/\/\u30b9\u30af\u30ed\u30fc\u30eb\u30d0\u30fc\u4f4d\u7f6e\r\n #endregion\r\n #region Start\u95a2\u6570 Updata\u95a2\u6570\r\n public void Start()\r\n {\r\n \/\/myPlayer\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u53d6\u5f97(\u7bc4\u56f2\u30c1\u30e3\u30c3\u30c8\u767a\u8a00\u6642\u306bposition\u3068myPM\u4f7f\u3046)\r\n GetmyPlayer();\r\n \/\/\u7bc4\u56f2\u30c1\u30e3\u30c3\u30c8\u306e\u5834\u5408\u306f\u767d\u6587\u5b57\u306b\u3057\u3001\u6587\u5b57\u304c\uff35\uff29\u304b\u3089\u3042\u3075\u308c\u305f\u5834\u5408\u306f\u6298\u308a\u8fd4\u3059\u8a2d\u5b9a\r\n ChatStyleState.textColor = Color.white;\r\n ChatStyle.normal = ChatStyleState;\r\n ChatStyle.wordWrap = true;\r\n \/\/\u5168\u4f53\u30c1\u30e3\u30c3\u30c8\u306e\u5834\u5408\u306f\u8d64\u6587\u5b57\u306b\u3057\u3001\u6587\u5b57\u304c\uff35\uff29\u304b\u3089\u3042\u3075\u308c\u305f\u5834\u5408\u306f\u6298\u308a\u8fd4\u3059\u8a2d\u5b9a\r\n AllChatStyleState.textColor = Color.red;\r\n AllChatStyle.normal = AllChatStyleState;\r\n AllChatStyle.wordWrap = true;\r\n }\r\n public void Update()\r\n {\r\n \/\/ChatUI\u306e\u4f4d\u7f6e\u3092\u8abf\u6574\r\n this.GuiRect.y = Screen.height - this.GuiRect.height;\r\n \/\/ChatUI\u306e\u5927\u304d\u3055\u8abf\u6574\r\n GuiRect.width = Screen.width \/ 3;\r\n GuiRect.height = Screen.height \/ 3;\r\n }\r\n #endregion\r\n #region OnGUI\u95a2\u6570\r\n public void OnGUI()\r\n {\r\n if (!this.IsVisible || !PhotonNetwork.inRoom) \/\/\u8868\u793a\u30d5\u30e9\u30b0\u304cOFF\u307e\u305f\u306fphoton\u306b\u3064\u306a\u304c\u3063\u3066\u3044\u306a\u3044\u3068\u304d\r\n {\r\n \/\/UI\u975e\u8868\u793a\r\n return;\r\n }\r\n \/\/ChatUI\u306e\u4f5c\u6210\u958b\u59cb\r\n \/\/\u30c1\u30e3\u30c3\u30c8UI\u751f\u6210\u3000Begin&EndArea\u3067\u30c1\u30e3\u30c3\u30c8UI\u306e\u4f4d\u7f6e\u3068\u5927\u304d\u3055\u3092\u8a2d\u5b9a \r\n GUILayout.Window(0, GuiRect, ChatUIWindow, \"\"); \/\/\u30c1\u30e3\u30c3\u30c8UI\u30a6\u30a4\u30f3\u30c9\u30a6\u3092\u4f5c\u6210\r\n \/\/Enter\u3092\u62bc\u3059\u3068\r\n if (Event.current.type == EventType.KeyDown && (Event.current.keyCode == KeyCode.KeypadEnter || Event.current.keyCode == KeyCode.Return))\r\n {\r\n \/\/\u30c1\u30e3\u30c3\u30c8\u5165\u529b\u5f85\u3061\u72b6\u614b\u306b\u3059\u308b\r\n GUI.FocusControl(\"ChatInput\");\r\n }\r\n }\r\n #endregion\r\n #region \u30c1\u30e3\u30c3\u30c8UI\u751f\u6210\r\n void ChatUIWindow(int windowID)\r\n {\r\n \/\/Focus\u304c\u30c1\u30e3\u30c3\u30c8UI\u306b\u4e57\u3063\u3066\u308b\u3068\u304d\u306bEnter\u3092\u62bc\u3059\u3068\u30c1\u30e3\u30c3\u30c8\u767a\u8a00\u304c\u5b9f\u884c\u3055\u308c\u308b\r\n if (Event.current.type == EventType.KeyDown && (Event.current.keyCode == KeyCode.KeypadEnter || Event.current.keyCode == KeyCode.Return))\r\n {\r\n if (!string.IsNullOrEmpty(this.inputLine)) \/\/\u30c1\u30e3\u30c3\u30c8\u5165\u529b\u6b04\u304cNull\u3084Empty\u3067\u306a\u3044\u5834\u5408\r\n {\r\n \/\/\u7bc4\u56f2\u30c1\u30e3\u30c3\u30c8\u9001\u4fe1\u95a2\u6570\u5b9f\u884c\r\n SendChat(false);\r\n return;\r\n }\r\n }\r\n \/\/\u5782\u76f4\u306e\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u30b0\u30eb\u30fc\u30d7\u958b\u59cb\r\n GUILayout.BeginVertical();\r\n \/\/\u30b9\u30af\u30ed\u30fc\u30eb\u30d3\u30e5\u30fc\u958b\u59cb\u4f4d\u7f6e\r\n scrollPos = GUILayout.BeginScrollView(scrollPos);\r\n \/\/\u30c1\u30e3\u30c3\u30c8\u30ed\u30b0\u8868\u793a\u7528\u30d5\u30ec\u30ad\u30b7\u30d6\u30eb\u30b9\u30da\u30fc\u30b9\u751f\u6210\r\n GUILayout.FlexibleSpace();\r\n \/\/\u30d5\u30ec\u30ad\u30b7\u30d6\u30eb\u30b9\u30da\u30fc\u30b9\u306b\u30c1\u30e3\u30c3\u30c8\u30ed\u30b0\u3092\u8868\u793a\r\n for (int i = 0; i <= messages.Count - 1; i++)\r\n {\r\n if (chatKind[i] != true) \/\/\u7bc4\u56f2\u30c1\u30e3\u30c3\u30c8\u3067\u3042\u308c\u3070\r\n {\r\n GUILayout.Label(messages[i], ChatStyle);\r\n }\r\n else \/\/\u5168\u30c1\u30e3\u30c3\u30c8\u3067\u3042\u308c\u3070\r\n {\r\n GUILayout.Label(messages[i], AllChatStyle);\r\n }\r\n }\r\n \/\/\u30b9\u30af\u30ed\u30fc\u30eb\u30d3\u30e5\u30fc\u7d42\u4e86\r\n GUILayout.EndScrollView();\r\n \/\/\u6c34\u5e73\u306e\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u30b0\u30eb\u30fc\u30d7\u958b\u59cb\r\n GUILayout.BeginHorizontal();\r\n \/\/\u5165\u529b\u30c6\u30ad\u30b9\u30c8\u30d5\u30a3\u30fc\u30eb\u30c9\u751f\u6210\u3001Focus\u304c\u4e57\u3063\u305f\u72b6\u614b\u3092ChatInput\u3068\u547d\u540d\r\n GUI.SetNextControlName(\"ChatInput\");\r\n inputLine = GUILayout.TextField(inputLine, 200);\r\n \/\/\u300cSend\u300d\u30dc\u30bf\u30f3\u3092\u751f\u6210\u304b\u3064\u62bc\u3057\u305f\u3068\u304d\u306b\u306f\u7bc4\u56f2\u30c1\u30e3\u30c3\u30c8\u9001\u4fe1\r\n if (GUILayout.Button(\"Send\", GUILayout.ExpandWidth(false)))\r\n {\r\n \/\/\u7bc4\u56f2\u30c1\u30e3\u30c3\u30c8\u9001\u4fe1\u95a2\u6570\u5b9f\u884c\r\n SendChat(false);\r\n }\r\n \/\/All\u30dc\u30bf\u30f3\u3092\u751f\u6210\u304b\u3064\u62bc\u3057\u305f\u3068\u304d\u306b\u306f\u5168\u4f53\u30c1\u30e3\u30c3\u30c8\u9001\u4fe1\r\n if (GUILayout.Button(\"All\", GUILayout.ExpandWidth(false)))\r\n {\r\n \/\/\u5168\u4f53\u30c1\u30e3\u30c3\u30c8\u9001\u4fe1\u95a2\u6570\u5b9f\u884c\r\n SendChat(true);\r\n }\r\n \/\/\u6c34\u5e73\u306e\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u30b0\u30eb\u30fc\u30d7\u7d42\u4e86\r\n GUILayout.EndHorizontal();\r\n \/\/\u5782\u76f4\u306e\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u30b0\u30eb\u30fc\u30d7\u7d42\u4e86\r\n GUILayout.EndVertical();\r\n }\r\n #endregion\r\n #region GetmyPlayer \u81ea\u30ad\u30e3\u30e9\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092myPlayer\u306b\u767b\u9332\r\n void GetmyPlayer()\r\n {\r\n \/\/\u81ea\u30ad\u30e3\u30e9\u306eID\u53d6\u5f97\r\n int myPlayerID = PhotonNetwork.player.ID;\r\n \/\/\u5168\u3066\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u53d6\u5f97\r\n players = GameObject.FindGameObjectsWithTag(\"Player\");\r\n \/\/\u5168\u3066\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304b\u3089\u81ea\u30ad\u30e3\u30e9\u3092ID\u3067\u691c\u7d22\u3057\u3001\u53d6\u308a\u51fa\u3059\r\n foreach (GameObject player in players)\r\n {\r\n int playerLoopId = player.GetComponent<PhotonView>().owner.ID;\r\n if (playerLoopId == myPlayerID)\r\n {\r\n \/\/\u81ea\u30d7\u30ec\u30a4\u30e4\u30fc\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u53d6\u5f97\r\n myPlayer = player;\r\n }\r\n }\r\n return;\r\n }\r\n #endregion\r\n #region \u30c1\u30e3\u30c3\u30c8\u9001\u4fe1\u95a2\u6570\r\n void SendChat(bool isAll)\r\n {\r\n \/\/chatRPC\r\n this.photonView.RPC(\"Chat\", PhotonTargets.All, myPlayer.transform.position, this.inputLine, isAll);\r\n \/\/\u9001\u4fe1\u5f8c\u3001\u5165\u529b\u6b04\u3092\u7a7a\u306b\u3057\u3001\u30b9\u30af\u30ed\u30fc\u30eb\u6700\u4e0b\u4f4d\u7f6e\u306b\u79fb\u52d5\r\n this.inputLine = \"\";\r\n scrollPos.y = Mathf.Infinity;\r\n }\r\n #endregion\r\n #region ChatRPC RPC\u547c\u51fa\u5074\uff1a\u9001\u4fe1\u8005\u3000RPC\u53d7\u4fe1\u5074\uff1a\u53d7\u4fe1\u8005\r\n [PunRPC]\r\n public void Chat(Vector3 senderposition, string newLine, bool isAll, PhotonMessageInfo mi)\r\n {\r\n if (messages.Count >= 100) \/\/\u30c1\u30e3\u30c3\u30c8\u30ed\u30b0\u304c\u591a\u304f\u306a\u3063\u3066\u6765\u305f\u3089\u30ed\u30b0\u3092\u524a\u9664\u3057\u3066\u304b\u3089\u53d7\u4fe1\r\n {\r\n messages.Clear(); \/\/\u5168\u3066\u306e\u30c1\u30e3\u30c3\u30c8\u30ed\u30b0\u3092\u524a\u9664\r\n chatKind.Clear(); \/\/\u5168\u3066\u306e\u30c1\u30e3\u30c3\u30c8\u306e\u7a2e\u985e\u60c5\u5831\u524a\u9664\r\n }\r\n if (!isAll) \/\/\u7bc4\u56f2\u30c1\u30e3\u3068\u3057\u3066\u53d7\u4fe1\r\n {\r\n \/\/myPlayer\u3068sender\u306e\u8ddd\u96e2\u304b\u3089\u53d7\u4fe1\u3059\u308b\u304b\u5224\u65ad\r\n if (Vector3.Distance(myPlayer.transform.position, senderposition) < 10)\r\n {\r\n \/\/chat\u53d7\u4fe1\r\n ReceiveChat(newLine, isAll, mi);\r\n }\r\n }\r\n else if (isAll) \/\/\u5168\u30c1\u30e3\u3068\u3057\u3066\u53d7\u4fe1\r\n {\r\n \/\/chat\u53d7\u4fe1\r\n ReceiveChat(newLine, isAll, mi);\r\n }\r\n \/\/\u53d7\u4fe1\u3057\u305f\u3068\u304d\u306f\u30b9\u30af\u30ed\u30fc\u30eb\u6700\u4e0b\u4f4d\u7f6e\r\n scrollPos.y = Mathf.Infinity;\r\n }\r\n #endregion\r\n #region \u30c1\u30e3\u30c3\u30c8\u53d7\u4fe1\u95a2\u6570\r\n void ReceiveChat(string _newLine, bool isAll, PhotonMessageInfo _mi)\r\n {\r\n \/\/\u9001\u4fe1\u8005\u306e\u540d\u524d\u7528\u5909\u6570\r\n string senderName = \"anonymous\";\r\n if (_mi.sender != null)\r\n {\r\n \/\/\u9001\u4fe1\u8005\u306e\u540d\u524d\u304c\u3042\u308c\u3070\r\n if (!string.IsNullOrEmpty(_mi.sender.NickName))\r\n {\r\n senderName = _mi.sender.NickName;\r\n }\r\n else\r\n {\r\n senderName = \"player \" + _mi.sender.ID;\r\n }\r\n }\r\n \/\/\u53d7\u4fe1\u3057\u305f\u30c1\u30e3\u30c3\u30c8\u3092\u30ed\u30b0\u306b\u8ffd\u52a0\r\n this.messages.Add(senderName + \": \" + _newLine);\r\n this.chatKind.Add(isAll);\r\n return;\r\n }\r\n #endregion\r\n\r\n public void AddLine(string newLine)\r\n {\r\n this.messages.Add(newLine);\r\n }\r\n}<\/pre>\n
\u66f8\u304d\u63db\u3048\u5f8c\u306eChatUI\u69cb\u9020<\/h3>\n
\u5b9f\u969b\u306b\u52d5\u304b\u3057\u3066\u307f\u307e\u3057\u3087\u3046<\/h2>\n