広告 ゲーム実況 音楽

【OBS】ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

ニコニコ・ニコ生の配信で画面にコメントを表示したい場合の表示方法を説明します。

この通りにやれば簡単に画面表示ができます。

https://norikazu-miyao.com/?p=32771

ギター配信

https://norikazu-miyao.com/?p=32771

ゲーム配信

コメジェネで3行以上のコメントを表示したい方にも対応している方法です。

全部この通りにやって、コピペをすればOKなので是非試してみてください!

かなり長いですが一度設定すればもう何もしなくていいので頑張ってみてください!

ニコ生のコメントを画面表示にするために色々とダウンロードします 【OBS・ニコニコ】

今回の方法ではいくつかツールをダウンロードする必要があります。

詳しく説明しますが、4つダウンロードする必要があります。

  • OBS Studio
  • HTML5コメントジェネレーター改
  • HTML5コメントジェネレーター
  • MultiCommentViewer
  •  
    をダウンロードしていきます。

    ニコ生のコメントを画面表示にOBSが必要なのでダウンロードをしましょう 【OBS・ニコニコ】

    まずは「OBS Studio」という外部ツールが必要となるのでダウンロードをしておいてください。

    無料で使えてとても優秀で使いやすい配信用ツールです。

    >>> OBS ダウンロード

    HTML5コメントジェネレーター改をダウンロードしてニコ生のコメントを画面表示する 【OBS・ニコニコ】

    次にダウンロードするのは「HTML5コメントジェネレーター改」です。

    「HTML5コメントジェネレーター」ではなく「HTML5コメントジェネレーター」です。

    HTML5コメントジェネレーターについては2017年で更新が止まっており、有志がそれをベースに機能追加したものがコメントジェネレーター改です。

    ちなみにHTML5コメントジェネレーターでもコメントは表示されますが改の方が機能が豊富で使いやすいです。

    とはいいつつも「改」を使うためには「HTML5コメントジェネレーター」をダウンロードする必要があります。

    「HTML5コメントジェネレーター」をダウンロードする

    まずHTML5コメントジェネレーターをダウンロードしましょう。

    >>> HTML5コメントジェネレーター ダウンロード
    (HTML5コメントジェネレーターをダウンロードしてください)

    HTML5コメントジェネレーター改をダウンロードしてニコ生のコメントを画面表示する 【OBS・ニコニコ】【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。オススメのCSSで見やすくアイコン表示&透過にカスタマイズ!コメジェネの3行にも対応【コピペでOK・ニコニコ生放送】
    HTML5コメントジェネレーターを押して一番上のをダウンロードします。
    HTML5コメントジェネレーター改をダウンロードしてニコ生のコメントを画面表示する 【OBS・ニコニコ】【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。オススメのCSSで見やすくアイコン表示&透過にカスタマイズ!コメジェネの3行にも対応【コピペでOK・ニコニコ生放送】
    この記事を書いている時点での最新Verは「hcg_0_0_8a.zip」です。

    「HTML5コメントジェネレーター改」をダウンロードする

    次は「HTML5コメントジェネレーター改」をダウンロードします。

    >>> HTML5コメントジェネレーター改 ダウンロード

    真ん中あたりにある「DLはあるか!? \ここにいるぞ/ 」の部分がリンクです。

    上記リンクを押すと「CommentGenerator改」を保存する画面になります。

    「HTML5コメントジェネレーター改」をダウンロードする HTML5コメントジェネレーター改をダウンロードしてニコ生のコメントを画面表示する 【OBS・ニコニコ】【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。オススメのCSSで見やすくアイコン表示&透過にカスタマイズ!コメジェネの3行にも対応【コピペでOK・ニコニコ生放送】

    お好きな場所にダウンロードしてください。

    ファイルのZIP(圧縮)を解凍する

    「コメントジェネレーター」も「改」もZIP(圧縮)されているので「すべて展開」で解凍(開いて)おいてください。

    ■コメントジェネレーター
    「HTML5コメントジェネレーター改」をダウンロードする HTML5コメントジェネレーター改をダウンロードしてニコ生のコメントを画面表示する 【OBS・ニコニコ】【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。オススメのCSSで見やすくアイコン表示&透過にカスタマイズ!コメジェネの3行にも対応【コピペでOK・ニコニコ生放送】

    「HTML5コメントジェネレーター改」をダウンロードする HTML5コメントジェネレーター改をダウンロードしてニコ生のコメントを画面表示する 【OBS・ニコニコ】【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。オススメのCSSで見やすくアイコン表示&透過にカスタマイズ!コメジェネの3行にも対応【コピペでOK・ニコニコ生放送】

    ■コメントジェネレーター改
    「HTML5コメントジェネレーター改」をダウンロードする HTML5コメントジェネレーター改をダウンロードしてニコ生のコメントを画面表示する 【OBS・ニコニコ】【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。オススメのCSSで見やすくアイコン表示&透過にカスタマイズ!コメジェネの3行にも対応【コピペでOK・ニコニコ生放送】

    「HTML5コメントジェネレーター改」をダウンロードする HTML5コメントジェネレーター改をダウンロードしてニコ生のコメントを画面表示する 【OBS・ニコニコ】【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。オススメのCSSで見やすくアイコン表示&透過にカスタマイズ!コメジェネの3行にも対応【コピペでOK・ニコニコ生放送】

    「HTML5コメントジェネレーター改」をダウンロードする HTML5コメントジェネレーター改をダウンロードしてニコ生のコメントを画面表示する 【OBS・ニコニコ】【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。オススメのCSSで見やすくアイコン表示&透過にカスタマイズ!コメジェネの3行にも対応【コピペでOK・ニコニコ生放送】

    マルチコメントビューワー(MultiCommentViewer)をダウンロードしてニコ生のコメントを画面表示する 【OBS・ニコニコ】

    次にダウンロードするのは「MultiCommentViewer」です。

    >>> MultiCommentViewer ダウンロード

    マルチコメントビューワー(MultiCommentViewer)をダウンロードしてニコ生のコメントを画面表示する 【OBS・ニコニコ】

    マルチコメントビューワーも解凍して開いておきます

    マルチコメントビューワー(MultiCommentViewer)をダウンロードしてニコ生のコメントを画面表示する 【OBS・ニコニコ】

    マルチコメントビューワー(MultiCommentViewer)をダウンロードしてニコ生のコメントを画面表示する 【OBS・ニコニコ】

    のり
    これでダウンロードは全て終わりました!
    ここから設定をしていきます!

    「コメントジェネレーター」と「改」の設定でニコ生のコメント表示 【OBS・ニコニコ】

    「コメントジェネレーター」と「改」の設定をしていきます。

    ここから先は「改の使用方法」に書かれていますが説明します。

    「コメントジェネレーター」と「改」の設定でニコ生のコメント表示 【OBS・ニコニコ】

    先程、「コメントジェネレーター」と「改」を解凍して開きました。

    横に二つ並べます。

    「コメントジェネレーター」と「改」の設定でニコ生のコメント表示 【OBS・ニコニコ】【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    CommentGenerator.htmlを「コメントジェネレーター」に移動して上書きします

    「改」にあるCommentGenerator.htmlを「コメントジェネレーター」に移動して上書きします

    CommentGenerator.htmlを「コメントジェネレーター」に移動して上書きします 「コメントジェネレーター」と「改」の設定でニコ生のコメント表示 【OBS・ニコニコ】【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    CommentGenerator.htmlを「コメントジェネレーター」に移動して上書きします 「コメントジェネレーター」と「改」の設定でニコ生のコメント表示 【OBS・ニコニコ】【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】
    「ファイルを置き換える」をして上書きをします。

    CommentGenerator.jsを「コメントジェネレーター」に移動して上書きします

    同じように「改」にあるCommentGenerator.jsを「コメントジェネレーター」に移動して上書きします。

    「改」にあるCommentGenerator.jsを「コメントジェネレーター」に移動して上書きします 【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    「改」にあるCommentGenerator.jsを「コメントジェネレーター」に移動して上書きします 【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    「改」にあるCommentGenerator.jsを「コメントジェネレーター」に移動して上書きします 【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    「CommentGenerator_multi.html」「hcg_setting_ex」も移動します。

    「改」にある「CommentGenerator_multi.html」「hcg_setting_ex」も「コメントジェネレーター」に移動します。
    【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】「CommentGenerator_multi.html」「hcg_setting_ex」も移動します。

    コメジェネ改の設定をしてニコ生のコメントを表示させる 【OBS・ニコニコ】

    次はコメジェネ改の連携と設定を一気にしていきます!

    「hcg_setting_ex」をダブルクリックをして開きます。

    コメジェネ改の設定をしてニコ生のコメントを表示させる 【OBS・ニコニコ】【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    「コメジェネの場所」を設定します

    基本設定の上部にある「コメジェネの場所」の参照をクリックします。
    コメジェネ改の設定をしてニコ生のコメントを表示させる 【OBS・ニコニコ】【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    フォルダを選択する画面になるので「hcg_0_0_8a」の中にある「CommentGenerator0.0.8a」を選択します。
    コメジェネ改の設定をしてニコ生のコメントを表示させる 【OBS・ニコニコ】【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    ニコ生のコメントを画面表示するためにコメジェネ改の設定をする 【OBS・ニコニコ】

    僕のコメジェネ改の設定画面を載せておきます。
    少しだけ変更もあるのでそのまま真似て変更をしてみてください。

    基本設定

    コメジェネ改の設定をしてニコ生のコメントを表示させる 【OBS・ニコニコ】 【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    詳細設定

    コメジェネ改の設定をしてニコ生のコメントを表示させる 【OBS・ニコニコ】 【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    詳細設定2

    コメジェネ改の設定をしてニコ生のコメントを表示させる 【OBS・ニコニコ】 【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    本体設定

    コメジェネ改の設定をしてニコ生のコメントを表示させる 【OBS・ニコニコ】 【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    マルチ用設定

    コメジェネ改の設定をしてニコ生のコメントを表示させる 【OBS・ニコニコ】 【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    ニコ生のコメントを画面表示するためにコメジェネ内にある「CommentGenerator.html」をメモ帳で開いて書き換える 【OBS・ニコニコ】

    コメジェネ内にある「CommentGenerator.html」を右クリックを押して「プログラムから開く」→「メモ帳」で開きます。
    コメジェネ内にある「CommentGenerator.html」を右クリックを押して「プログラムから開く」→「メモ帳」で開きます。【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    コメジェネ内にある「CommentGenerator.html」を右クリックを押して「プログラムから開く」→「メモ帳」で開きます。【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    メモ帳にて開くとこの画面が開きます。
    コメジェネ内にある「CommentGenerator.html」を右クリックを押して「プログラムから開く」→「メモ帳」で開きます。【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    色々と設定ができるのですが、僕の設定をそのままお使いください。(「hcg_0_0_8a.zip」での設定です。アプデした場合は別のものになる可能性があります。)

    下記コードを全部コピーして全部貼り付け&上書きしてください。

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>HTML5 コメントジェネレーター改0.90</title>
    6. <!-- Copyright (c) 2015 Takayasu Machimura (kilin)
    7.      This software is released under the MIT License. -->
    8. <!-- ver 0.0.8改90 -->
    9. <script src="https://code.createjs.com/1.0.0/createjs.min.js"></script>
    10. <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    11. <script src="CommentGenerator.js"></script>
    12. <script>
    13. //outlineが壊れるのを少しマシにする
    14. //参考:https://github.com/HAKASHUN/manabi/issues/86
    15. createjs.Text.prototype.draw = function(ctx, ignoreCache) {
    16.     if (this.DisplayObject_draw(ctx, ignoreCache)) {
    17.         return true;
    18.     }
    19.     var col = this.color || "#000";
    20.     if (this.outline) {
    21.         ctx.strokeStyle = col;
    22.         ctx.lineWidth = this.outline * 1;
    23.         ctx.miterLimit = 2;
    24.         ctx.lineJoin = 'circle';
    25.     } else {
    26.         ctx.fillStyle = col;
    27.     }
    28.     this._drawText(this._prepContext(ctx));
    29.     return true;
    30. };
    31. function init() {
    32.     var HcgFormat = {};
    33.     var TxtFormat = new Object();
    34.     function InitLoad(){return new Promise(resolve => { $.ajax({
    35.         url: 'init.xml',
    36.         type: 'GET',
    37.         dataType: 'xml',
    38.         timeout: 5000,
    39.      }).fail(function(){
    40.         /************************************************/
    41.         createjs.Ticker.framerate = 60; //フレームレート
    42.         HcgFormat.CanvasWidth = 350;    //キャンバスの横
    43.         HcgFormat.CanvasHeight = 200;    //キャンバスの縦
    44.         HcgFormat.CommentMax = 5;        //コメントの最大表示数 ここを4以上にしたらcanvasのCanvasHeight値も変えること
    45.         HcgFormat.SkinHeight = 32;        //使用するスキンの高さ
    46.         HcgFormat.SkinWidth = HcgFormat.CanvasWidth;        //使用するスキンの幅
    47.         HcgFormat.LineLimit = 3;        //改行の最大回数
    48.         HcgFormat.AnimeSpeed = 0.5;        //スキンをアニメーションする速度
    49.         /************************************************/
    50.         HcgFormat.ComStart=     "「"    ;    //コメントの始め(コテハンとの区切り)
    51.         HcgFormat.ComEnd=     "」"    ;    //コメントの終わり
    52.         /************************************************/
    53.         HcgFormat.DemoMode = 0;                //デモモード(1で開始)
    54.         HcgFormat.demokote = "コテハン";        //デモモードコテハン
    55.         HcgFormat.democomment = "コメント";    //デモモードコメント
    56.         HcgFormat.DemoInterbal= 2000;            //自動コメント間隔(ミリ秒)
    57.         /************************************************/
    58.         HcgFormat.LoadInterbal = 500;    //読み込みの間隔(ミリ秒)
    59.         HcgFormat.MoveSpeed = 0.05;        //移動時に使う係数
    60.         /************************************************/
    61.         console.log("init.xml:ロード失敗、CommentGenerator.htmlの設定を使用します");
    62.         resolve();
    63.      }).done(function(xml) {
    64.         createjs.Ticker.framerate = Number(xml.getElementsByTagName('FrameRate')[0].firstChild.nodeValue);
    65.         HcgFormat.CanvasWidth = Number(xml.getElementsByTagName('CanvasWidth')[0].firstChild.nodeValue);
    66.         HcgFormat.CanvasHeight = Number(xml.getElementsByTagName('CanvasHeight')[0].firstChild.nodeValue);
    67.         HcgFormat.CommentMax = Number(xml.getElementsByTagName('CommentMax')[0].firstChild.nodeValue);
    68.         HcgFormat.LoadInterbal = (xml.getElementsByTagName('LoadInterbal')[0])?Number(xml.getElementsByTagName('LoadInterbal')[0].firstChild.nodeValue):500;
    69.         HcgFormat.SkinHeight = Number(xml.getElementsByTagName('SkinHeight')[0].firstChild.nodeValue);
    70.         if(xml.getElementsByTagName('SkinWidth')[0]!=null){
    71.             HcgFormat.SkinWidth = (xml.getElementsByTagName('SkinWidth')[0].firstChild.nodeValue.match(/^([\s\0]+$|fix)/i))?"FIX":Number(xml.getElementsByTagName('SkinWidth')[0].firstChild.nodeValue);
    72.         }else{
    73.             HcgFormat.SkinWidth = HcgFormat.CanvasWidth;
    74.         }
    75.         HcgFormat.LineLimit = Number(xml.getElementsByTagName('LineLimit')[0].firstChild.nodeValue);
    76.         HcgFormat.AnimeSpeed = Number(xml.getElementsByTagName('AnimeSpeed')[0].firstChild.nodeValue);
    77.         HcgFormat.ComStart= (xml.getElementsByTagName('ComStart')[0].firstChild.nodeValue.match(/^\n[\s\0]+$/))?"\n\t":xml.getElementsByTagName('ComStart')[0].firstChild.nodeValue;
    78.         HcgFormat.ComEnd=(xml.getElementsByTagName('ComEnd')[0].firstChild.nodeValue.match(/^[\s\0]+$/))? "":xml.getElementsByTagName('ComEnd')[0].firstChild.nodeValue;
    79.         HcgFormat.DemoMode = xml.getElementsByTagName('DemoMode')[0].firstChild.nodeValue=='1';
    80.         HcgFormat.demokote = xml.getElementsByTagName('DemoKote')[0].firstChild.nodeValue;
    81.         HcgFormat.democomment = xml.getElementsByTagName('DemoComment')[0].firstChild.nodeValue;
    82.         HcgFormat.DemoInterbal= Number(xml.getElementsByTagName('DemoInterval')[0].firstChild.nodeValue);
    83.         HcgFormat.MoveSpeed = Number(xml.getElementsByTagName('MoveSpeed')[0].firstChild.nodeValue);
    84.         console.log("init.xml:ロード成功");
    85.         resolve();
    86.      })
    87.     })};
    88.     InitLoad().then(()=>{
    89.     var stage = new createjs.Stage("canvas");
    90.     stage.canvas.width = HcgFormat['CanvasWidth'];
    91.     stage.canvas.height = HcgFormat['CanvasHeight'];
    92.     stage.update();
    93.     var obj = [];
    94.     var startTime = Math.floor(new Date().getTime()/1000);
    95.     var startNo = -10;
    96.     var no_ch = 0;
    97.     var CommentNow = 0;
    98.     var SettingLoaded = false;
    99.     var CommentWait = false;
    100.     var FullPath = location.href;
    101.     var PathArray = FullPath.split('/');
    102.     var PathHead = "";
    103.     var txtFormat;
    104.     var exFormat;
    105.     var date1;
    106.     var date2;
    107.     var neta_name;
    108.     var nowCount = 0;
    109.     if(PathArray[2] == "absolute") {
    110.         PathHead = "http://absolute/";
    111.     } else if(PathArray[0] == "file:"){
    112.         PathHead = "file:///";
    113.     } else {
    114.         PathHead = "";
    115.     }
    116.     HcgFormat.PathHead = PathHead;
    117.     var CurrentPath = "";
    118.     for(var i=0; i<PathArray.length-1; i++){
    119.         CurrentPath += PathArray[i] + "/";
    120.     }
    121.     HcgFormat.CurrentPath = CurrentPath;
    122.     createjs.Ticker.addEventListener('tick', mainLoop);
    123.     function mainLoop() {
    124.         stage.update();
    125.     }
    126.     SettingFunc();
    127.     HcgFormat['FrameRate']=createjs.Ticker.framerate;
    128.     var SettingTimer = setInterval(SettingFunc, 15000);
    129.     if(HcgFormat.DemoMode) {
    130.         console.log("デモモード");
    131.         var DemoTimer = setInterval(DemoFunc, HcgFormat.DemoInterbal);
    132.     } else {
    133.         console.log("HTML5コメントジェネレーター");
    134.         var CommentTimer = setInterval(CommentFunc, HcgFormat.LoadInterbal);
    135.     }
    136.     
    137.     //コメント(XML)を読んでコメントジェネレーターに渡す
    138.     function CommentFunc() {
    139.         if(SettingLoaded) {
    140.             //XML読み込み
    141.             $(function(){
    142.                 parse();
    143.             });
    144.             function parse(type) {
    145.                 $.ajax({
    146.                     url: 'comment.xml',
    147.                     type: 'GET',
    148.                     dataType: 'xml',
    149.                     timeout: 5000,
    150.                  }).done(function(xml) {
    151.                     xml = xml.getElementsByTagName('comment');
    152.                     if(no_ch>xml.length){
    153.                         no_ch=0;
    154.                     }
    155.                     for(var i=no_ch; i<xml.length; i++) {
    156.                         if((startTime < xml[i].getAttributeNode("time").value) ||
    157.                         ((startTime == xml[i].getAttributeNode("time").value) && ((startNo < xml[i].getAttributeNode("no").value) || (no_ch < i)))) {
    158.                             startTime = xml[i].getAttributeNode("time").value;
    159.                             startNo = xml[i].getAttributeNode("no").value;
    160.                             no_ch = i;
    161.                             var SlashComment = TxtFormat['SlashCommentVisible'];
    162.                             var BSPComment = TxtFormat['BSPCommentVisible'];
    163.                             var OwnerComment = TxtFormat['OwnerCommentVisible'];
    164.                             if(isComment(xml[i].firstChild.nodeValue, SlashComment, BSPComment)) {
    165.                                 if(OwnerComment==1 || ((OwnerComment==0)&&(xml[i].getAttributeNode("owner").value!=1))) {
    166.                                     //事前処理
    167.                                     var handle="";
    168.                                     if(xml[i].getAttributeNode("handle") != null) {
    169.                                         if(xml[i].getAttributeNode("handle").value == ""){
    170.                                             handle = TxtFormat['NoHandleName'];
    171.                                         }else{
    172.                                             handle = xml[i].getAttributeNode("handle").value;
    173.                                         }
    174.                                     } else {
    175.                                         if(xml[i].getAttributeNode("no") != null) {
    176.                                             if(TxtFormat['NoHandleType']==0) {
    177.                                                 handle = xml[i].getAttributeNode("no").value+"コメ";
    178.                                             } else if(TxtFormat['NoHandleType']==1) {
    179.                                                 handle = TxtFormat['NoHandleName'];
    180.                                             } else if((TxtFormat['NoHandleType']==2)&&(xml[i].getAttributeNode("owner").value==0)) {
    181.                                                 return;
    182.                                             }
    183.                                         }
    184.                                     }
    185.                                     console.log(xml[i].firstChild.nodeValue);
    186.                                     //本編
    187.                                     new CommentGenerator(handle, fixComment(xml[i].firstChild.nodeValue), HcgFormat, TxtFormat, (xml[i].getAttributeNode("owner")) ? xml[i].getAttributeNode("owner").value : false, null, new Date((xml[i].getAttributeNode("time").value.length==10)?xml[i].getAttributeNode("time").value*1000:Number(xml[i].getAttributeNode("time").value.substr(0,13))))
    188.                                      .then((CGen)=>{
    189.                                         obj[CommentNow] = CGen;
    190.                                         //表示開始
    191.                                         stage.addChild(obj[CommentNow].getBase());
    192.                                         obj[CommentNow].Play();
    193.                                         //移動処理
    194.                                         if(!TxtFormat['NewMove']){//通常
    195.                                             if ((TxtFormat['Direction'] == 3)&&(TxtFormat['moveF'] != '0')){
    196.                                                 var Xmove = Number(TxtFormat['moveX']) * (1 + (Number(TxtFormat['c_nlX']) * obj[CommentNow].getLongline()));
    197.                                                 var Ymove = Number(TxtFormat['moveY']) * (1 + (Number(TxtFormat['c_nlY']) * obj[CommentNow].getLongline()))+Number(TxtFormat['comSpace']);
    198.                                             }else{
    199.                                                 var Xmove = 0;
    200.                                                 if(TxtFormat['newLine'] == 4){
    201.                                                     var Ymove = obj[CommentNow].textcomment.lineHeight*(1+obj[CommentNow].getLongline())+Number(TxtFormat['comSpace']);
    202.                                                 }else if(TxtFormat['newLine'] == 5){
    203.                                                     var Ymove = Number(HcgFormat['SkinHeight'])*(1+obj[CommentNow].getLongline())+Number(TxtFormat['comSpace']);
    204.                                                 }else{
    205.                                                     var Ymove = Number(HcgFormat['SkinHeight'])+Number(TxtFormat['comSpace']);
    206.                                                 }
    207.                                             }
    208.                                             for(var i=CommentNow; i>(CommentNow-(HcgFormat['CommentMax']-1)); i--) {
    209.                                                 if((i-1)>=0&&obj[(i-1)]!=null) {
    210.                                                     if(TxtFormat['floated'] == 1){
    211.                                                         if((TxtFormat['yReverse'] == 0)&&((TxtFormat['Direction'] != 3)||((TxtFormat['Direction'] == 3)&&(TxtFormat['moveF'] == '0')))){
    212.                                                             obj[(i-1)].MoveAdd(Xmove, -Ymove, TxtFormat);
    213.                                                         }else{
    214.                                                             obj[(i-1)].MoveAdd(Xmove, Ymove, TxtFormat);
    215.                                                         }
    216.                                                     }else{
    217.                                                         if(TxtFormat['yReverse'] == 0){
    218.                                                             obj[(i-1)].PlateMove(Xmove, -Ymove);
    219.                                                         }else{
    220.                                                             obj[(i-1)].PlateMove(Xmove, Ymove);
    221.                                                         }
    222.                                                     }
    223.                                                     if(TxtFormat['Alpha_Sub']){
    224.                                                         if(TxtFormat['Direction'] != 3){
    225.                                                             obj[i-1].SubAlpha(((TxtFormat['A_area']==0)?TxtFormat['Base_a']:100)/HcgFormat['CommentMax']);
    226.                                                         }else{
    227.                                                             obj[i-1].SubAlpha(TxtFormat['Sub_a']);
    228.                                                         }
    229.                                                     }
    230.                                                 }
    231.                                             }
    232.                                         }else{//新しいコメントの方を移動
    233.                                             nowCount++;
    234.                                             if ((TxtFormat['Direction'] == 3)&&(TxtFormat['moveF'] != '0')){
    235.                                                 var Xmove = Number(TxtFormat['moveX']) * (1 + (Number(TxtFormat['c_nlX']) * obj[CommentNow].getLongline()));
    236.                                                 var Ymove = Number(TxtFormat['moveY']) * (1 + (Number(TxtFormat['c_nlY']) * obj[CommentNow].getLongline()))+Number(TxtFormat['comSpace']);
    237.                                                 if(TxtFormat['Alpha_Sub']){
    238.                                                     for(i=1;i<nowCount;i++){
    239.                                                         obj[CommentNow-i].SubAlpha(((TxtFormat['A_area']==0)?TxtFormat['Base_a']:100)/HcgFormat['CommentMax']);
    240.                                                     }
    241.                                                 }
    242.                                             }else{
    243.                                                 var Xmove = 0;
    244.                                                 var bufline=0;
    245.                                                 for(i=1;i<nowCount;i++){
    246.                                                     bufline+=obj[CommentNow-i].getLongline()+1;
    247.                                                     if(TxtFormat['Alpha_Sub']){
    248.                                                         obj[CommentNow-i].SubAlpha(TxtFormat['Sub_a']);
    249.                                                     }
    250.                                                 }
    251.                                                 if(TxtFormat['newLine'] == 4){
    252.                                                     var Ymove = obj[CommentNow].textcomment.lineHeight*bufline+Number(TxtFormat['comSpace']);
    253.                                                 }else if(TxtFormat['newLine'] == 5){
    254.                                                     var Ymove = Number(HcgFormat['SkinHeight'])*(bufline)+Number(TxtFormat['comSpace']);
    255.                                                 }else{
    256.                                                     var Ymove = Number(HcgFormat['SkinHeight'])*(bufline)+Number(TxtFormat['comSpace']);
    257.                                                 }
    258.                                             }
    259.                                             if(((TxtFormat['floated'] == 1)&&(TxtFormat['yReverse'] == 0)&&(TxtFormat['MoveF'] != 3))
    260.                                              ||((TxtFormat['floated'] == 0)&&(TxtFormat['yReverse'] == 0))){
    261.                                                 Ymove*=-1;
    262.                                             }
    263.                                             if((obj[CommentNow].getBline()+Ymove+Number(HcgFormat['SkinHeight'])*(Ymove>0?obj[CommentNow].getLongline()+1:-(obj[CommentNow].getLongline()+1))>HcgFormat['CanvasHeight'])||(obj[CommentNow].getBline()+Ymove<0)){
    264.                                                 nowCount=1;
    265.                                                 Ymove=0;
    266.                                             }
    267.                                             if(TxtFormat['floated'] == 1){
    268.                                                 obj[CommentNow].MoveAdd(Xmove, Ymove, TxtFormat);
    269.                                             }else{
    270.                                                 obj[CommentNow].PlateMove(Xmove, Ymove);
    271.                                             }
    272.                                         }
    273.                                         //削除処理
    274.                                         if(TxtFormat['TimeType'] != 1){
    275.                                             obj[CommentNow].setTimer(setTimeout(function(num){objDel(num)}.bind(null, CommentNow),(Number(TxtFormat['TimeValue'])+((((TxtFormat['F_out']==1)||(TxtFormat['Z_out']>0)||(TxtFormat['Direction']!=2))*3)*(30/HcgFormat['FrameRate'])*((0.1/Number((TxtFormat['Direction']=='3')?TxtFormat['outK']:HcgFormat['MoveSpeed']))*(TxtFormat['MovePattern']!=2)?1:2)))*1000));
    276.                                         }
    277.                                         if((CommentNow-HcgFormat['CommentMax'])>=0) {
    278.                                             if(obj[(CommentNow-HcgFormat['CommentMax'])]!=null){
    279.                                                 clearTimeout(obj[(CommentNow-HcgFormat['CommentMax'])].getTimer());
    280.                                                 objDel(CommentNow-HcgFormat['CommentMax']);
    281.                                             }
    282.                                         }
    283.                                         CommentNow++;
    284.                                     });
    285.                                 }
    286.                             }
    287.                             break;
    288.                         }
    289.                     }
    290.                     if(startNo == -10){
    291.                         startNo = -11;
    292.                     }
    293.                  }).fail(function(){
    294.                     if(startNo==-10&&CommentWait){
    295.                         CommentWait = false;
    296.                         alert("comment.xml:ロード失敗");
    297.                     }else{
    298.                         console.log("comment.xml:ロード失敗");
    299.                     }
    300.                 });
    301.             }
    302.         }
    303.     }
    304.     
    305.     function SettingFunc() {
    306.         //XML読み込み
    307.         $(function(){
    308.             parse();
    309.         });
    310.         function parse(type) {//setting.xml読み込み
    311.             var setlist = [];
    312.             function setaj1(){
    313.                 var d = new $.Deferred();
    314.                 var xhr = new XMLHttpRequest();
    315.                 xhr.open('GET', 'setting.xml', true);
    316.                 xhr.onload = function(){
    317.                     if(xhr.responseXML.lastModified != date1){
    318.                         var xml = xhr.responseXML.documentElement;
    319.                         var skinfile = "";
    320.                         var skinfolder = "";
    321.                         if(xml.getElementsByTagName('SkinFile')[0].firstChild != null) {
    322.                             skinfile = xml.getElementsByTagName('SkinFile')[0].firstChild.nodeValue;
    323.                         }
    324.                         if(xml.getElementsByTagName('SkinFolder')[0].firstChild != null) {
    325.                             skinfolder = xml.getElementsByTagName('SkinFolder')[0].firstChild.nodeValue;
    326.                         }
    327.                         txtFormat = {
    328.                             'HandleVisible' : xml.getElementsByTagName('HandleVisible')[0].firstChild.nodeValue,
    329.                             'HandleOrder' : xml.getElementsByTagName('HandleOrder')[0].firstChild.nodeValue,
    330.                             'Honorific' : xml.getElementsByTagName('Honorific')[0].firstChild.nodeValue,
    331.                             'NoHandleType' : xml.getElementsByTagName('NoHandleType')[0].firstChild.nodeValue,
    332.                             'NoHandleName' : xml.getElementsByTagName('NoHandleName')[0].firstChild.nodeValue,
    333.                             'TxtColor' : xml.getElementsByTagName('TxtColor')[0].firstChild.nodeValue,
    334.                             'TxtFont' : xml.getElementsByTagName('TxtFont')[0].firstChild.nodeValue,
    335.                             'TxtSize' : xml.getElementsByTagName('TxtSize')[0].firstChild.nodeValue,
    336.                             'BgColor' : xml.getElementsByTagName('BgColor')[0].firstChild.nodeValue,
    337.                             'BgColorType' : xml.getElementsByTagName('BgColorType')[0].firstChild.nodeValue,
    338.                             'TxtEdgeColor' : xml.getElementsByTagName('TxtEdgeColor')[0].firstChild.nodeValue,
    339.                             'TxtEdgeType' : xml.getElementsByTagName('TxtEdgeType')[0].firstChild.nodeValue,
    340.                             'TxtEdgeValue' : xml.getElementsByTagName('TxtEdgeValue')[0].firstChild.nodeValue,
    341.                             'SkinType' : xml.getElementsByTagName('SkinType')[0].firstChild.nodeValue,
    342.                             'SkinFile' : skinfile,
    343.                             'SkinFolder' : skinfolder,
    344.                             'TimeType' : xml.getElementsByTagName('TimeType')[0].firstChild.nodeValue,
    345.                             'TimeValue' : xml.getElementsByTagName('TimeValue')[0].firstChild.nodeValue,
    346.                             'TxtUpSpace' : xml.getElementsByTagName('TxtUpSpace')[0].firstChild.nodeValue,
    347.                             'TxtLeftSpace' : xml.getElementsByTagName('TxtLeftSpace')[0].firstChild.nodeValue,
    348.                             'TxtLength' : xml.getElementsByTagName('TxtLength')[0].firstChild.nodeValue,
    349.                             'TxtLengthValue' : xml.getElementsByTagName('TxtLengthValue')[0].firstChild.nodeValue,
    350.                             'OwnerCommentVisible' : xml.getElementsByTagName('OwnerCommentVisible')[0].firstChild.nodeValue,
    351.                             'SlashCommentVisible' : xml.getElementsByTagName('SlashCommentVisible')[0].firstChild.nodeValue,
    352.                             'BSPCommentVisible' : xml.getElementsByTagName('BSPCommentVisible')[0].firstChild.nodeValue,
    353.                             'Direction' : xml.getElementsByTagName('Direction')[0].firstChild.nodeValue,
    354.                             'userBGColor' : xml.getElementsByTagName('userBGColor')[0].firstChild.nodeValue,
    355.                             'userSkinName' : xml.getElementsByTagName('userSkinName')[0].firstChild.nodeValue,
    356.                             'Nico' : (xml.getElementsByTagName('nico_name')[0]!=null)?new SiteSet(xml.getElementsByTagName('nico_name')[0]):null,
    357.                             'YouTube' : (xml.getElementsByTagName('youtube_name')[0]!=null)?new SiteSet(xml.getElementsByTagName('youtube_name')[0]):null,
    358.                             'Twitch' : (xml.getElementsByTagName('twitch_name')[0]!=null)?new SiteSet(xml.getElementsByTagName('twitch_name')[0]):null,
    359.                             'Fresh' : (xml.getElementsByTagName('fresh_name')[0]!=null)?new SiteSet(xml.getElementsByTagName('fresh_name')[0]):null,
    360.                             'AbemaFresh' : (xml.getElementsByTagName('abemafresh_name')[0]!=null)?new SiteSet(xml.getElementsByTagName('abemafresh_name')[0]):null,
    361.                             'Openrec' : (xml.getElementsByTagName('openrec_name')[0]!=null)?new SiteSet(xml.getElementsByTagName('openrec_name')[0]):null,
    362.                             'Mixer' : (xml.getElementsByTagName('mixer_name')[0]!=null)?new SiteSet(xml.getElementsByTagName('mixer_name')[0]):null,
    363.                             'Twicas' : (xml.getElementsByTagName('twicas_name')[0]!=null)?new SiteSet(xml.getElementsByTagName('twicas_name')[0]):null,
    364.                             'Mirrativ' : (xml.getElementsByTagName('mirrativ_name')[0]!=null)?new SiteSet(xml.getElementsByTagName('mirrativ_name')[0]):null,
    365.                             'Periscope' : (xml.getElementsByTagName('periscope_name')[0]!=null)?new SiteSet(xml.getElementsByTagName('periscope_name')[0]):null,
    366.                             'LineLive' : (xml.getElementsByTagName('linelive_name')[0]!=null)?new SiteSet(xml.getElementsByTagName('linelive_name')[0]):null,
    367.                             'Whowatch' : (xml.getElementsByTagName('whowatch_name')[0]!=null)?new SiteSet(xml.getElementsByTagName('whowatch_name')[0]):null,
    368.                             'Mildom' : (xml.getElementsByTagName('mildom_name')[0]!=null)?new SiteSet(xml.getElementsByTagName('mildom_name')[0]):null,
    369.                             'BouyomiChan' : (xml.getElementsByTagName('bouyomichan_name')[0]!=null)?new SiteSet(xml.getElementsByTagName('bouyomichan_name')[0]):null,
    370.                             'Nothing' : (xml.getElementsByTagName('nothing_name')[0]!=null)?new SiteSet(xml.getElementsByTagName('nothing_name')[0]):null,
    371.                             'Date1' : xhr.responseXML.lastModified
    372.                         };
    373.                         d.resolve();
    374.                     }else{
    375.                         if(exFormat==null){
    376.                             console.log("setting.xml:ロード失敗");
    377.                             d.reject();
    378.                         }else{
    379.                             d.resolve();
    380.                         }
    381.                     }
    382.                 }
    383.                 xhr.send();
    384.                 return d.promise();
    385.             };
    386.             setlist.push(setaj1());
    387.             function setaj2(){//setting_ex.xml読み込み
    388.                 var d = new $.Deferred();
    389.                 var xhr = new XMLHttpRequest();
    390.                 xhr.open('GET', 'setting_ex.xml', true);
    391.                 xhr.onload = function(){
    392.                     if(xhr.responseXML.lastModified != date2){
    393.                         var xml = xhr.responseXML.documentElement;
    394.                         exFormat = {
    395.                             'exColor' : xml.getElementsByTagName('exColor')[0].firstChild.nodeValue,
    396.                             'comToColor' : xml.getElementsByTagName('ComToColor')[0].firstChild.nodeValue,
    397.                             'comCC' : xml.getElementsByTagName('ComCC')[0].firstChild.nodeValue,
    398.                             'ownerReverse' : xml.getElementsByTagName('OwnerReverse')[0].firstChild.nodeValue,
    399.                             'yReverse' : xml.getElementsByTagName('yReverse')[0].firstChild.nodeValue,
    400.                             'Align' : (xml.getElementsByTagName('Align')[0])?xml.getElementsByTagName('Align')[0].firstChild.nodeValue=='1':false,
    401.                             'txtLine' : xml.getElementsByTagName('TxtLine')[0].firstChild.nodeValue,
    402.                             'newLine' : xml.getElementsByTagName('NewLine')[0].firstChild.nodeValue,
    403.                             'NLset' : (xml.getElementsByTagName('NLset')[0])?xml.getElementsByTagName('NLset')[0].firstChild.nodeValue:'0',
    404.                             'comSpace' : xml.getElementsByTagName('CommentSpace')[0].firstChild.nodeValue,
    405.                             'lineHeight' : xml.getElementsByTagName('LineHeight')[0].firstChild.nodeValue,
    406.                             'ownerColor' : xml.getElementsByTagName('OwnerColor')[0].firstChild.nodeValue,
    407.                             'typeTime' : xml.getElementsByTagName('TypeTime')[0].firstChild.nodeValue,
    408.                             'inX' : xml.getElementsByTagName('In')[0].getAttributeNode('X').value,
    409.                             'inY' : xml.getElementsByTagName('In')[0].getAttributeNode('Y').value,
    410.                             'targetX' : xml.getElementsByTagName('Tar')[0].getAttributeNode('X').value,
    411.                             'targetY' : xml.getElementsByTagName('Tar')[0].getAttributeNode('Y').value,
    412.                             'outX' : xml.getElementsByTagName('Out')[0].getAttributeNode('X').value,
    413.                             'outY' : xml.getElementsByTagName('Out')[0].getAttributeNode('Y').value,
    414.                             'inK' : xml.getElementsByTagName('In')[0].firstChild.nodeValue,
    415.                             'outK' : xml.getElementsByTagName('Out')[0].firstChild.nodeValue,
    416.                             'Ang' : (xml.getElementsByTagName('Ang')[0])?xml.getElementsByTagName('Ang')[0].firstChild.nodeValue=='1':false,
    417.                             'moveX' : xml.getElementsByTagName('Move')[0].getAttributeNode('X').value,
    418.                             'c_nlX' : (xml.getElementsByTagName('Move')[0].getAttributeNode('c_nlX'))?xml.getElementsByTagName('Move')[0].getAttributeNode('c_nlX').value:0,
    419.                             'moveY' : xml.getElementsByTagName('Move')[0].getAttributeNode('Y').value,
    420.                             'c_nlY' : (xml.getElementsByTagName('Move')[0].getAttributeNode('c_nlY'))?xml.getElementsByTagName('Move')[0].getAttributeNode('c_nlY').value:0,
    421.                             'moveF' : xml.getElementsByTagName('Move')[0].firstChild.nodeValue,
    422.                             'floated' : xml.getElementsByTagName('Tar')[0].firstChild.nodeValue,
    423.                             'NewMove' : (xml.getElementsByTagName('NewMove')[0])?xml.getElementsByTagName('NewMove')[0].firstChild.nodeValue=='1':false,
    424.                             'HandleLimit' : xml.getElementsByTagName('HandleLimit')[0].firstChild.nodeValue,
    425.                             'HandleTrim' : xml.getElementsByTagName('HandleTrim')[0].firstChild.nodeValue,
    426.                             'ComNL' : xml.getElementsByTagName('ComNL')[0].firstChild.nodeValue,
    427.                             'TimeStamp' : xml.getElementsByTagName('TimeStamp')[0].firstChild.nodeValue,
    428.                             'SiteColor' : xml.getElementsByTagName('SiteColor')[0].firstChild.nodeValue,
    429.                             'Base_a' : (xml.getElementsByTagName('Base_a')[0])?xml.getElementsByTagName('Base_a')[0].firstChild.nodeValue:1,
    430.                             'A_area' : (xml.getElementsByTagName('A_area')[0])?xml.getElementsByTagName('A_area')[0].firstChild.nodeValue:0,
    431.                             'F_in' : (xml.getElementsByTagName('F_in')[0])?xml.getElementsByTagName('F_in')[0].firstChild.nodeValue=='1':false,
    432.                             'F_out' : (xml.getElementsByTagName('F_out')[0])?xml.getElementsByTagName('F_out')[0].firstChild.nodeValue=='1':false,
    433.                             'F_in_k' : (xml.getElementsByTagName('F_in_k')[0])?xml.getElementsByTagName('F_in_k')[0].firstChild.nodeValue:1,
    434.                             'F_out_k' : (xml.getElementsByTagName('F_out_k')[0])?xml.getElementsByTagName('F_out_k')[0].firstChild.nodeValue:1,
    435.                             'Z_in' : (xml.getElementsByTagName('Z_in')[0])?Number(xml.getElementsByTagName('Z_in')[0].firstChild.nodeValue):0,
    436.                             'Z_out' : (xml.getElementsByTagName('Z_out')[0])?Number(xml.getElementsByTagName('Z_out')[0].firstChild.nodeValue):0,
    437.                             'Z_in_k' : (xml.getElementsByTagName('Z_in_k')[0])?xml.getElementsByTagName('Z_in_k')[0].firstChild.nodeValue:1,
    438.                             'Z_out_k' : (xml.getElementsByTagName('Z_out_k')[0])?xml.getElementsByTagName('Z_out_k')[0].firstChild.nodeValue:1,
    439.                             'MovePattern' : (xml.getElementsByTagName('MovePattern')[0])?Number(xml.getElementsByTagName('MovePattern')[0].firstChild.nodeValue):0,
    440.                             'NewMove' : (xml.getElementsByTagName('NewMove')[0])?xml.getElementsByTagName('NewMove')[0].firstChild.nodeValue=='1':false,
    441.                             'HandleLimit' : xml.getElementsByTagName('HandleLimit')[0].firstChild.nodeValue,
    442.                             'HandleTrim' : xml.getElementsByTagName('HandleTrim')[0].firstChild.nodeValue,
    443.                             'ComNL' : xml.getElementsByTagName('ComNL')[0].firstChild.nodeValue,
    444.                             'TimeStamp' : xml.getElementsByTagName('TimeStamp')[0].firstChild.nodeValue,
    445.                             'SiteColor' : xml.getElementsByTagName('SiteColor')[0].firstChild.nodeValue,
    446.                             'Base_a' : (xml.getElementsByTagName('Base_a')[0])?xml.getElementsByTagName('Base_a')[0].firstChild.nodeValue:1,
    447.                             'A_area' : (xml.getElementsByTagName('A_area')[0])?xml.getElementsByTagName('A_area')[0].firstChild.nodeValue:0,
    448.                             'F_in' : (xml.getElementsByTagName('F_in')[0])?xml.getElementsByTagName('F_in')[0].firstChild.nodeValue=='1':false,
    449.                             'F_out' : (xml.getElementsByTagName('F_out')[0])?xml.getElementsByTagName('F_out')[0].firstChild.nodeValue=='1':false,
    450.                             'F_in_k' : (xml.getElementsByTagName('F_in_k')[0])?xml.getElementsByTagName('F_in_k')[0].firstChild.nodeValue:1,
    451.                             'F_out_k' : (xml.getElementsByTagName('F_out_k')[0])?xml.getElementsByTagName('F_out_k')[0].firstChild.nodeValue:1,
    452.                             'Accel' : (xml.getElementsByTagName('Accel')[0])?Number(xml.getElementsByTagName('Accel')[0].firstChild.nodeValue):20,
    453.                             'Brake' : (xml.getElementsByTagName('Brake')[0])?Number(xml.getElementsByTagName('Brake')[0].firstChild.nodeValue):50,
    454.                             'Alpha_Sub' : (xml.getElementsByTagName('Alpha_Sub')[0])?xml.getElementsByTagName('Alpha_Sub')[0].firstChild.nodeValue=='1':false,
    455.                             'Sub_a' : (xml.getElementsByTagName('Sub_a')[0])?Number(xml.getElementsByTagName('Sub_a')[0].firstChild.nodeValue):0.33,
    456.                             'Skin_Align' : (xml.getElementsByTagName('Skin_Align')[0])?xml.getElementsByTagName('Skin_Align')[0].firstChild.nodeValue:'00',
    457.                             'Com_Align' : (xml.getElementsByTagName('Com_Align')[0])?xml.getElementsByTagName('Com_Align')[0].firstChild.nodeValue:'22',
    458.                             'Date2' : xhr.responseXML.lastModified
    459.                         };
    460.                         d.resolve();
    461.                     }else{
    462.                         if(exFormat==null){
    463.                             console.log("追加設定のロード失敗");
    464.                             d.reject();
    465.                         }else{
    466.                             d.resolve();
    467.                         }
    468.                     }
    469.                 }
    470.                 xhr.send();
    471.                 return d.promise();
    472.             };
    473.             setlist.push(setaj2());
    474.             //両方読み込めたら合体
    475.             $.when.apply($, setlist).done(function(){
    476.                 if((txtFormat['Date1']!=date1)||(exFormat['Date2']!=date2)){
    477.                     setTxtFormat(Object.assign(txtFormat,exFormat));
    478.                     date1=txtFormat['Date1'];
    479.                     date2=exFormat['Date2'];
    480.                     CommentWait = true;
    481.                 }
    482.             }).fail(function(){
    483.                 if(!SettingLoaded){
    484.                     alert("設定のロードに失敗しました。\nsetting.xmlとsetting_ex.xmlがあるか\n確認してOKを押してください。");
    485.                 }
    486.             });
    487.         }
    488.     }
    489.     
    490.     //デモ
    491.     function DemoFunc(){
    492.         if(SettingLoaded) {
    493.             //放送主扱いを使う
    494.             var demoowner=Math.round( Math.random());
    495.             var n=demoowner ? "放送主":HcgFormat.demokote;
    496.             //本編
    497.             new CommentGenerator(n.slice(0), HcgFormat.democomment, HcgFormat, TxtFormat, demoowner, null, new Date())
    498.              .then((CGen)=>{
    499.                 obj[CommentNow] = CGen;
    500.                 //表示開始
    501.                 stage.addChild(obj[CommentNow].getBase());
    502.                 obj[CommentNow].Play();
    503.                 //移動処理
    504.                 if(!TxtFormat['NewMove']){//通常
    505.                     if ((TxtFormat['Direction'] == 3)&&(TxtFormat['moveF'] != '0')){
    506.                         var Xmove = Number(TxtFormat['moveX']) * (1 + (Number(TxtFormat['c_nlX']) * obj[CommentNow].getLongline()));
    507.                         var Ymove = Number(TxtFormat['moveY']) * (1 + (Number(TxtFormat['c_nlY']) * obj[CommentNow].getLongline()))+Number(TxtFormat['comSpace']);
    508.                     }else{
    509.                         var Xmove = 0;
    510.                         if(TxtFormat['newLine'] == 4){
    511.                             var Ymove = obj[CommentNow].textcomment.lineHeight*(1+obj[CommentNow].getLongline())+Number(TxtFormat['comSpace']);
    512.                         }else if(TxtFormat['newLine'] == 5){
    513.                             var Ymove = Number(HcgFormat['SkinHeight'])*(1+obj[CommentNow].getLongline())+Number(TxtFormat['comSpace']);
    514.                         }else{
    515.                             var Ymove = Number(HcgFormat['SkinHeight'])+Number(TxtFormat['comSpace']);
    516.                         }
    517.                     }
    518.                     for(var i=CommentNow; i>(CommentNow-(HcgFormat['CommentMax']-1)); i--) {
    519.                         if((i-1)>=0&&obj[(i-1)]!=null) {
    520.                             if(TxtFormat['floated'] == 1){
    521.                                 if((TxtFormat['yReverse'] == 0)&&((TxtFormat['Direction'] != 3)||((TxtFormat['Direction'] == 3)&&(TxtFormat['moveF'] == '0')))){
    522.                                     obj[(i-1)].MoveAdd(Xmove, -Ymove, TxtFormat);
    523.                                 }else{
    524.                                     obj[(i-1)].MoveAdd(Xmove, Ymove, TxtFormat);
    525.                                 }
    526.                             }else{
    527.                                 if(TxtFormat['yReverse'] == 0){
    528.                                     obj[(i-1)].PlateMove(Xmove, -Ymove);
    529.                                 }else{
    530.                                     obj[(i-1)].PlateMove(Xmove, Ymove);
    531.                                 }
    532.                             }
    533.                             if(TxtFormat['Alpha_Sub']){
    534.                                 if(TxtFormat['Direction'] != 3){
    535.                                     obj[i-1].SubAlpha(((TxtFormat['A_area']==0)?TxtFormat['Base_a']:100)/HcgFormat['CommentMax']);
    536.                                 }else{
    537.                                     obj[i-1].SubAlpha(TxtFormat['Sub_a']);
    538.                                 }
    539.                             }
    540.                         }
    541.                     }
    542.                 }else{//新しいコメントの方を移動
    543.                     nowCount++;
    544.                     if ((TxtFormat['Direction'] == 3)&&(TxtFormat['moveF'] != '0')){
    545.                         var Xmove = Number(TxtFormat['moveX']) * (1 + (Number(TxtFormat['c_nlX']) * obj[CommentNow].getLongline()));
    546.                         var Ymove = Number(TxtFormat['moveY']) * (1 + (Number(TxtFormat['c_nlY']) * obj[CommentNow].getLongline()))+Number(TxtFormat['comSpace']);
    547.                         if(TxtFormat['Alpha_Sub']){
    548.                             for(i=1;i<nowCount;i++){
    549.                                 obj[CommentNow-i].SubAlpha(((TxtFormat['A_area']==0)?TxtFormat['Base_a']:100)/HcgFormat['CommentMax']);
    550.                             }
    551.                         }
    552.                     }else{
    553.                         var Xmove = 0;
    554.                         var bufline=0;
    555.                         for(i=1;i<nowCount;i++){
    556.                             bufline+=obj[CommentNow-i].getLongline()+1;
    557.                             if(TxtFormat['Alpha_Sub']){
    558.                                 obj[CommentNow-i].SubAlpha(TxtFormat['Sub_a']);
    559.                             }
    560.                         }
    561.                         if(TxtFormat['newLine'] == 4){
    562.                             var Ymove = obj[CommentNow].textcomment.lineHeight*bufline+Number(TxtFormat['comSpace']);
    563.                         }else if(TxtFormat['newLine'] == 5){
    564.                             var Ymove = Number(HcgFormat['SkinHeight'])*(bufline)+Number(TxtFormat['comSpace']);
    565.                         }else{
    566.                             var Ymove = Number(HcgFormat['SkinHeight'])*(bufline)+Number(TxtFormat['comSpace']);
    567.                         }
    568.                     }
    569.                     if(((TxtFormat['floated'] == 1)&&(TxtFormat['yReverse'] == 0)&&(TxtFormat['MoveF'] != 3))
    570.                      ||((TxtFormat['floated'] == 0)&&(TxtFormat['yReverse'] == 0))){
    571.                         Ymove*=-1;
    572.                     }
    573.                     if((obj[CommentNow].getBline()+Ymove+Number(HcgFormat['SkinHeight'])*(Ymove>0?obj[CommentNow].getLongline()+1:-(obj[CommentNow].getLongline()+1))>HcgFormat['CanvasHeight'])||(obj[CommentNow].getBline()+Ymove<0)){
    574.                         nowCount=1;
    575.                         Ymove=0;
    576.                     }
    577.                     if(TxtFormat['floated'] == 1){
    578.                         obj[CommentNow].MoveAdd(Xmove, Ymove, TxtFormat);
    579.                     }else{
    580.                         obj[CommentNow].PlateMove(Xmove, Ymove);
    581.                     }
    582.                 }
    583.                 //削除処理
    584.                 if(TxtFormat['TimeType'] != 1){
    585.                     obj[CommentNow].setTimer(setTimeout(function(num){objDel(num)}.bind(null, CommentNow),(Number(TxtFormat['TimeValue'])+((((TxtFormat['F_out']==1)||(TxtFormat['Z_out']>0)||(TxtFormat['Direction']!=2))*3)*(30/HcgFormat['FrameRate'])*((0.1/Number((TxtFormat['Direction']=='3')?TxtFormat['outK']:HcgFormat['MoveSpeed']))*(TxtFormat['MovePattern']!=2)?1:2)))*1000));
    586.                 }
    587.                 if((CommentNow-HcgFormat['CommentMax'])>=0) {
    588.                     if(obj[(CommentNow-HcgFormat['CommentMax'])]!=null){
    589.                         clearTimeout(obj[(CommentNow-HcgFormat['CommentMax'])].getTimer());
    590.                         objDel(CommentNow-HcgFormat['CommentMax']);
    591.                     }
    592.                 }
    593.                 CommentNow++;
    594.             });
    595.         }
    596.     }
    597.     
    598.     function setTxtFormat(txtFormat) {
    599.         console.log("設定を読み込みました");
    600.         TxtFormat = txtFormat;
    601.         SettingLoaded = true;
    602.     }
    603.     
    604.     //コメントとして処理するかどうかの判断
    605.     function isComment(comment, Slash, BSP) {
    606.         if(comment.substring(0,11)=="/press show") {
    607.             //ニコ生のBSP
    608.             if(BSP==1) {
    609.                 return true;
    610.             } else {
    611.                 return false;
    612.             }
    613.         } else if(comment.substring(0,1)=="/") {
    614.             // "/"から始まるコメント
    615.             if(Slash==1) {
    616.                 return true;
    617.             } else {
    618.                 return false;
    619.             }
    620.         } else if(comment.match(/^[\s\0]+$/)) {
    621.             return false;
    622.         }
    623.         return true;
    624.     }
    625.     
    626.     //コメント処理
    627.     function fixComment(comment) {
    628.         if(comment.substring(0,5)=="/perm") {
    629.             //運営コメント(perm)
    630.             var perm_array = comment.split(" ");
    631.             var perm = "";
    632.             for(var i=1; i<perm_array.length; i++) {
    633.                 perm += perm_array[i]+ " ";
    634.             }
    635.             comment = perm;
    636.         } else if(comment.substring(0,7)=="/nicoad") {
    637.             //運営コメント(広告)
    638.             var nicoad = comment.match(/\"message\"\:\"(.+)さんが([0-9]+)pt.+?(?:「(.+)」)?\"/i);
    639.             if(nicoad[3]){
    640.                 comment = "広告:"+nicoad[1]+"さん("+nicoad[2]+"pt)"+"["+nicoad[3]+"]";
    641.             }else{
    642.                 comment = "広告:"+nicoad[1]+"さん("+nicoad[2]+"pt)";
    643.             }
    644.         } else if(comment.substring(0,9)=="/uadpoint") {
    645.             //運営コメント(広告ポイント)
    646.             var nicoad_pt = comment.match(/(?:[0-9]+).+?([0-9]+)/i);
    647.             comment = "広告累計:"+nicoad_pt[1]+"pt";
    648.         } else if(comment.substring(0,5)=="/info") {
    649.             //運営コメント(インフォ)
    650.             var nico_info = comment.match(/\/info [0-9]+ (.+)/i);
    651.             comment = nico_info[1];
    652.         } else if(comment.substring(0,4)=="/spi") {
    653.             //運営コメント(新市場)
    654.             var nico_neta = comment.match(/(「.+」){1,}が貼/i);
    655.             console.log(nico_neta);
    656.             comment = "ネタ台";
    657.             for(i=1;i<nico_neta.length;i++){
    658.                 comment += nico_neta[i];
    659.             }
    660.             comment += "が追加";
    661.         } else if(comment.substring(0,4)=="/coe") {
    662.             //運営コメント(ゲーム起動)
    663.             var nico_appli = comment.match(/\/coe (?:start|stop) [0-9]+(?: \"(.+?)["__])?/i);
    664.             if(nico_appli[1]){
    665.                 neta_name = nico_appli[1];
    666.                 comment = neta_name+"を起動しました";
    667.             }else{
    668.                 comment = neta_name+"が終了しました";
    669.             }
    670.         } else if(comment.substring(0,11)=="/press show") {
    671.             //BSPコメント
    672.             var bsp_array = comment.split(" ");
    673.             var bsp = "";
    674.             for(var i=3; i<bsp_array.length; i++) {
    675.                 bsp += bsp_array[i]+ " ";
    676.             }
    677.             comment = bsp;
    678.         } else if(comment.substring(0,1)=="/") {
    679.             //運営コメント
    680.             comment = comment.substr(1);
    681.         }
    682.         //<>を元に戻す
    683.         comment = comment.replace(/&amp;/g,"&");
    684.         comment = comment.replace(/&lt;/g,"<");
    685.         comment = comment.replace(/&gt;/g,">");
    686.         
    687.         //htmlタグ除去
    688.         var pattern = /<("[^"]*"|'[^']*'|[^'">])*>/g;
    689.         comment = comment.replace(pattern,'');
    690.         
    691.         return comment.trim();
    692.     }
    693.     
    694.     //消去処理
    695.     function objDel(num){
    696.         obj[num].stopper();
    697.         stage.removeChild(obj[num].Remove());
    698.         delete obj[num];
    699.         if(num+nowCount>=CommentNow){
    700.             nowCount=0;
    701.         }
    702.     };
    703.     });
    704. }
    705. </script>
    706. </head>
    707. <body onload="init();">
    708.     <canvas id="canvas" width="350" height="200"></canvas>
    709. </body>
    710. </html>

    このコードをコピーしてペーストです。

    コメジェネ内にある「CommentGenerator.html」に「Ctrl+A」をしてから「Ctrl+V」でペーストです。

    最後に「ファイル」で「上書き保存」をしてください。

    コメジェネ内にある「CommentGenerator.html」を右クリックを押して「プログラムから開く」→「メモ帳」で開きます。【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    のり
    コメジェネの設定はおしまいです!

    ニコ生のコメントを画面表示するためのマルチコメントビューワー(MultiCommentViewer)の設定 【OBS・ニコニコ】 【OBS・ニコニコ】

    次はOBSの設定です。

    OBSとニコ生の連携
    表示するコメントの位置

    を設定します。

    OBSで配信のニコ生連携の設定を行う

    まず必ず最初にお持ちのニコ生とOBSの連携を行う必要があります。
    ここではコメントを表示させる方法を記事でまとめていますが、連携をしないと「誰のコメントを表示するか」が設定されない事になりますのでしっかり連携をしてください。

    OBSの「設定」→ 「配信」を開きます。
    OBSで配信のニコ生連携の設定を行う【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    3つの項目があるので下記のように設定をしてください。

    サービス niconico free member(ニコニコ生放送一般会員)
    niconico premium member(ニコニコ生放送プレミアム会員)
    サーバー Default
    ストリームキー ニコニコ生放送画面のストリームキー

    「ストリームキー」はニコニコ生放送画面のストリームキーをコピペをしてください。

    「ストリームキー」はニコニコ生放送画面のストリームキーをコピペをしてください。【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    連携は以上です。

    OBSにソースでブラウザを追加してニコ生のコメントを画面表示させる位置を用意します

    OBSを起動させるとこの画面が出てきます。

    OBSにソースでブラウザを追加してニコ生のコメントを画面表示させる位置を用意します【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    下段左から2番目のソースという部分を見ます。

    OBSにソースでブラウザを追加してニコ生のコメントを画面表示させる位置を用意します【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    ソースという部分に「ブラウザ」というのを追加します。

    「+」マークを押すと追加する項目が出てきます。

    OBSにソースでブラウザを追加してニコ生のコメントを画面表示させる位置を用意します【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    ブラウザをクリックします。

    OBSにソースでブラウザを追加してニコ生のコメントを画面表示させる位置を用意します【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    自分の分かりやすい名前をつけます。
    OBSにソースでブラウザを追加してニコ生のコメントを画面表示させる位置を用意します【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    このあと設定をします。

    とても簡単なのですぐに終わります。

    OBSでツイキャスのコメントを画面表示するための設定。

    ブラウザを追加して、追加されたブラウザをダブルクリックで開きます。

    OBSにソースでブラウザを追加してニコ生のコメントを画面表示させる位置を用意します【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    設定項目を入力していきます。

    ローカルファイル

    一番上にある「ローカルファイル」部分は「CommentGenerator.html」を指定します。

    OKを押して表示する位置を好きな場所に移動する

    OKを押すと画面上に四角が表示されます。

    OBSでツイキャスのコメントを画面表示するための設定。【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    クリックしながら動かすことができるので自分の好きな場所に移動させてください。

    OBSでツイキャスのコメントを画面表示するための設定。【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    のり
    次が最後の設定です!

    ニコ生のコメントを画面表示するためのマルチコメントビューワー(MultiCommentViewer)の設定 【OBS・ニコニコ】 【OBS・ニコニコ】

    最後はマルチコメントビューワー(MultiCommentViewer)の設定です。
    ニコ生のコメントを画面表示するためのマルチコメントビューワー(MultiCommentViewer)の設定 【OBS・ニコニコ】 【OBS・ニコニコ】 【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    プラグインにあるコメジェネ連携をする

    ニコ生のコメントを画面表示するためのマルチコメントビューワー(MultiCommentViewer)の設定 【OBS・ニコニコ】 【OBS・ニコニコ】 【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    ニコ生のコメントを画面表示するためのマルチコメントビューワー(MultiCommentViewer)の設定 【OBS・ニコニコ】 【OBS・ニコニコ】 【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    「HTML5コメジェネと連携」にチェックをいれます。
    ニコ生のコメントを画面表示するためのマルチコメントビューワー(MultiCommentViewer)の設定 【OBS・ニコニコ】 【OBS・ニコニコ】 【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    次が一番最後です。

    マルチコメントビューワー(MultiCommentViewer)のURL放送ID等にコメントを表示したいURLをコピペしてニコ生のコメントを表示します 【OBS・ニコニコ】

    最後にコメントを表示させるURLを入力します。

    四角の部分にURLを入力します。
    マルチコメントビューワー(MultiCommentViewer)のURL放送ID等にコメントを表示したいURLをコピペしてニコ生のコメントを表示します 【OBS・ニコニコ】 【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    左側のサイトが「Youtube Live」となっていますが、ニコ生のURLを入力すると勝手に「ニコ生」に切り替わります。
    マルチコメントビューワー(MultiCommentViewer)のURL放送ID等にコメントを表示したいURLをコピペしてニコ生のコメントを表示します 【OBS・ニコニコ】 【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    最後に「接続」をクリックします。
    マルチコメントビューワー(MultiCommentViewer)のURL放送ID等にコメントを表示したいURLをコピペしてニコ生のコメントを表示します 【OBS・ニコニコ】 【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    問題が無ければ下にコメントが表示されます。
    マルチコメントビューワー(MultiCommentViewer)のURL放送ID等にコメントを表示したいURLをコピペしてニコ生のコメントを表示します 【OBS・ニコニコ】 【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    ちなみにこのURLは自分の放送でなくても、誰の放送でもOKです。

    コメントが表示されるかの確認のためにニコ生のトップページに表示されている生放送のURLをなんでもいいので入力してみてくださいね。

    ニコニコ・ニコ生の放送の際にOBS、マルチコメントビューワー(MultiCommentViewer)を立ち上げる

    設定は終わりました。

    ニコニコ・ニコ生の放送の際に毎度OBS、マルチコメントビューワー(MultiCommentViewer)を立ち上げる必要があります。

    OBSを立ち上げて、マルチコメントビューワー(MultiCommentViewer)を立ち上げてURLを入力し接続を押します。

    OBSの配信開始を押して、ニコ生の放送開始をして終わりです。

    【OBS】ニコニコ・ニコ生のコメントを画面表示させる方法。透過&コメジェネの3行にも対応カスタマイズ【コピペでOK・ニコニコ生放送】

    このように書くと「やることがたくさん」と思うかもしれないですが、一度設定をすればもうやることはありません。

    また放送開始時もやることが多そうですが、慣れればすぐに放送が開始できます。

    最初は大変かもしれませんが是非色々試してみてください!

    【関連】【OBS】ツイキャスのコメントを画面表示させる方法。オススメのCSSで見やすくアイコン表示&透過にカスタマイズ!

    ツイキャスでコメントを画面表示させる方法も書いておいたので、ツイキャスをやる人はこちらの記事も参考にしていただければと思います。

    【OBS】ツイキャスのコメントを画面表示させる方法。オススメのCSSで見やすくアイコン表示&透過にカスタマイズ!

    【OBS】ツイキャスのコメントを画面表示させる方法。オススメのCSSで見やすくアイコン表示&透過にカスタマイズ!

    【こちらもオススメ】Twitterでフォローを外した・解除したの人を確認する方法。フォロワーからいなくなったリムーブした人を探して一気に削除するのがオススメ!

    Twitterでフォローを外した・解除したの人を確認する方法。フォロワーからいなくなったリムーブした人を「SocialDog」で探して一気に削除するのがオススメ!【PC・スマホアプリ】
    Twitterでフォロー外された・解除の人を確認する方法」を紹介します。

    「Twitterでフォロー外された・解除の人を確認する」のはSocial Dogで確認をすることができます。

    長年使っていてとても信頼している方法です。
    フォローされていないアカウントを探してフォロー解除もできます。

    • この記事を書いた人
    • 最新記事
    アバター画像

    のり - norinori0107

    ギタリストとして活動する中、1人でほぼ初海外で世界一周の旅に出る。帰国後演奏しながら株式会社を立ち上げ経営。役に立てることが嬉しいと思う性格。ブログのアクセスは月34万PV達成!(34万PV達成記事はこちら)、累計1100万PV達成。 ミルクティーとフルグラと甘い物と犬が好きです! ■ 詳しいプロフィール ■お問い合わせはコチラからどうぞ

    -ゲーム実況, 音楽
    -, ,