「è¨å®šï¼ž iTunesã¨App Storeã€ã§ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã¦ã‚‹ã®ã«Sandbox用ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’é¸ã¹ãªã„状æ³ã€‚
購入ボタンを押ã™ã¨"Confirm Your In-App Purchase"ダイアãƒã‚°ãŒè¡¨ç¤ºã•れる㌠アカウント入力欄ãŒç„¡ãã€ãƒ‘スワードã—ã‹å°‹ãられãªã„。
ã©ã†ã‚„ã‚‹ã®ã‹æŽ¢ã—回ã£ãŸçµæžœã€
「iTunesã¨App Storeã€ã‚’スクãƒãƒ¼ãƒ«ã—ãŸä¸‹ã®æ–¹ã«SANDBOXアカウントã®é …ç›®ãŒã‚ã£ãŸï¼
昔ã‹ã‚‰ã‚りã¾ã—ãŸï¼Ÿ
ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®æ“作ãƒã‚°ã‚„エラーãƒã‚°ã‚’サーãƒãƒ¼ã«é€ã‚‹ã«ã¯ä¸‹è¨˜ã®ã‚ˆã†ãªæ„Ÿã˜ã§å®Ÿè¡Œã™ã‚‹ã¨PlayStreamã«è¨˜éŒ²ã•れる。
PlayFabClientAPI.WritePlayerEvent(new WriteClientPlayerEventRequest()
{
Body = new Dictionary() {{ "foo", "bar"}},
EventName = "my_custom_event"
},
result => Debug.Log("Logged"),
error => Debug.LogError(error.GenerateErrorReport())
);
ãƒã‚°ã‚¤ãƒ³å®Œäº†ã—ã¦ã„ãªã„ã¨API実行ã§ããªã„ã®ã§ãƒã‚°ã‚¤ãƒ³ã‚¨ãƒ©ãƒ¼ã®ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã§ã¯é€ã‚Œãªã„。
ゲームアプリã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã¨ã—ã¦PlayFabを触り始ã‚ã¾ã—ãŸã€‚ä¸€é€šã‚Šæ©Ÿèƒ½ãŒæƒã£ã¦ã„ã¦ã™ã”ãä¾¿åˆ©ãªæ„Ÿã˜ã§ã™ã€‚
英語ドã‚ュメントやフォーラムを検索ã™ã‚Œã°å¤§æŠµã®äº‹ã¯è§£æ±ºã—ã¾ã™ãŒã€æ—¥æœ¬èªžæƒ…å ±ãŒå°‘ãªã„ã®ã§ã“ã“ã«ãƒ¡ãƒ¢ã—ã¦ãŠãã¾ã™ã€‚
ã¾ãšãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ç´ã¥ãæƒ…å ±ã‚’ã©ã†å–å¾—ã¾ãŸã¯ä¿å˜ã™ã‚‹ã‹ã«ã¤ã„ã¦ã€ä¸‹è¨˜ã®ã‚ˆã†ã«ä½¿ã„分ã‘ã‚‹ã®ãŒè‰¯ã•ãã†ã§ã™ã€‚
・プレイヤー表示å...
  PlayerProfileã®DisplayNameã§å–得。UpdateUserTitleDisplayNameã§æ›´æ–°ã€‚
・プレイヤーã®çµŒé¨“値やãƒã‚¤ã‚¹ã‚³ã‚¢ãªã©ã®æ•°å€¤...
  Statisticsデータã¨ã—ã¦ã‚µãƒ¼ãƒãƒ¼å´ã®CloudScriptを呼ã³å‡ºã—ã¦ä¿å˜ã™ã‚‹ã€‚
ã€€ã€€ä¸æ£å¯¾ç–ã¨ã—ã¦ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‹ã‚‰ã¯ç›´æŽ¥æ›¸ãè¾¼ã‚ãªã„よã†ã«ãƒ‡ãƒ•ォルトè¨å®šã•れã¦ã„る。
  Statisticsã¨ã—ã¦ä¿å˜ã—ã¦ã„るデータã¯Leaderboard(ランã‚ング機能)ã¨ã—ã¦æ‰±ãˆã‚‹ã€‚
ãƒ»ã‚²ãƒ¼ãƒ å†…é€šè²¨ã®æ‰€æŒæ•°...
  GetPlayerCombinedInfoã®UserVirtualCurrencyã§å–得。
ã€€ã€€ä¸æ£å¯¾ç–ã¨ã—ã¦ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‹ã‚‰ã¯é€šè²¨ã®åŠ ç®—æ¸›ç®—ãŒã§ããªã„よã†ã«ãƒ‡ãƒ•ォルトè¨å®šã•れã¦ã„る。
・æ¦å™¨ã‚„アイテムやスã‚ãƒ«ã®æ‰€æŒãƒ•ラグ...
ã€€ã€€ãƒžã‚¹ã‚¿ãƒ¼æƒ…å ±ã¯Catalogã§ç®¡ç†ã—ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®æ‰€æŒãƒ‡ãƒ¼ã‚¿ã¯GetUserInventoryã§å–得。
  販売アイテムã˜ã‚ƒãªã„物ã¯price 0ã§ã‚«ã‚¿ãƒã‚°ç™»éŒ²ã—ã¦ãŠãã€ã‚µãƒ¼ãƒãƒ¼å´ã®GrantItemsToUserã§ä»˜ä¸Žã™ã‚‹ã‹ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®PurchaseItemã§æ‰€æŒã™ã‚‹ã€‚
ãƒ»ãƒ•ãƒ¬ãƒ³ãƒ‰æƒ…å ±...
  GetFriendsListã‚„AddFriendを使ã†ã€‚
  フレンドã¨ã„ã†ã‚ˆã‚Šä¸€æ–¹çš„ãªãƒ•ã‚©ãƒãƒ¼ç™»éŒ²ãªã®ã§ã€ç›¸äº’フォãƒãƒ¼ã—ãŸã„ãªã‚‰è‡ªå‰ã§å‡¦ç†ã‚’書ã。
・ãã®ã»ã‹è«¸ã€…ã®ãƒ¦ãƒ¼ã‚¶æƒ…å ±...
  UserDataã¨ã—ã¦å–å¾—ã‚„ä¿å˜ã™ã‚‹ã€‚
  クライアントã‹ã‚‰æ›¸ãæ›ãˆã‚‰ã‚ŒãŸããªã„データã¯ã€ã‚µãƒ¼ãƒãƒ¼å´ã§UpdateUserReadOnlyDataを使ã†ã€‚
ãƒã‚°ã‚¤ãƒ³æ™‚ã«ã¾ã¨ã‚ã¦ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€ä¸‹è¨˜ã®ã‚ˆã†ã«GetPlayerCombinedInfoRequestParamsを指定ã™ã‚‹ã€‚
GetPlayerCombinedInfoRequestParams InfoRequestParams = new GetPlayerCombinedInfoRequestParams()
{
GetPlayerProfile = true,
ProfileConstraints = new PlayerProfileViewConstraints()
{
ShowDisplayName = true
},
GetPlayerStatistics =true,
GetUserInventory = true,
GetUserData = true,
GetUserReadOnlyData = true,
GetUserVirtualCurrency = true
};
PlayFabClientAPI.LoginWithCustomID(
new LoginWithCustomIDRequest()
{
TitleId = PlayFabSettings.TitleId,
CustomId = SystemInfo.deviceUniqueIdentifier,
CreateAccount = true,
InfoRequestParameters = InfoRequestParams
},
(result) => {},
(error) => {}
);
ä½ç½®åŒæœŸã‚’PhotonTransformViewã§è¡Œã†éš›ã€
補間処ç†ï¼ˆInterpolate Option)ã¯ã€ŒEstimated Speedã€ã‚’使ã†ã®ãŒè‰¯ã•ãã†ãªã®ã ãŒ
ç§»å‹•åœæ¢ã—ãŸæ™‚ã®åº§æ¨™ãŒå®Œå…¨ã«åŒæœŸã›ãšã‚ãšã‹ã«ãšã‚ŒãŸã¾ã¾ã«ãªã‚‹ç¾è±¡ãŒã‚る。
ã“れを解消ã™ã‚‹ã«ã¯ã€PhotonTransformViewPositionControl.csã®91〜94行目ã‚ãŸã‚Šã‚’下記ã®ã‚ˆã†ã™ã‚‹ã¨è‰¯ã•ãã†ã€‚
float estimatedSpeed = (Vector3.Distance(m_NetworkPosition, GetOldestStoredNetworkPosition()) / m_OldNetworkPositions.Count) * PhotonNetwork.sendRateOnSerialize;
if (estimatedSpeed < 1f)
{
currentPosition = targetPosition;
}
else
{
// move towards the targetPosition (including estimates, if that's active) with the speed calculated from the last updates.
currentPosition = Vector3.MoveTowards(currentPosition, targetPosition, Time.deltaTime * estimatedSpeed);
}
è¦ã¯ã€æŽ¨å®šé€Ÿåº¦ãŒã»ã¼0ã«ãªã£ã¦ã—ã¾ã†ã¨æœ€å¾Œã¾ã§ç§»å‹•ã—ã¦ãれãªã„ã®ã§
速度 1f未満ãªã‚‰å¼·åˆ¶çš„ã«ç›®æ¨™å€¤ã´ã£ãŸã‚Šã«ç§»å‹•ã•ã›ã¦ã„る。
Photonを使ã„å§‹ã‚ã‚‹ã«ã‚ãŸã£ã¦ã¯ä¸‹è¨˜ã®è¨˜äº‹ãŒã™ã”ãä¸å¯§ã§åˆ†ã‹ã‚Šã‚„ã™ã„。
ã€Unity】僕もPhotonを使ã„ãŸã„ #01〜#14
Androidã®WebViewã§Youtubeãªã©videoタグを使ã£ãŸæ˜ åƒå†ç”Ÿã‚’ã—よã†ã¨ã—ã¦ã¯ã¾ã£ãŸç‚¹ã‚’メモ。
WebViewプラグインã¯gree/unity-webviewを使用。
1)ã¾ãšã€æ˜ åƒãŒè¡¨ç¤ºã•れãªã„ç¾è±¡ã€‚(音ã ã‘æµã‚Œã¦ã€ç”»é¢è¡¨ç¤ºã¯é»’ã‹ç™½ã®ã¾ã¾ï¼‰
AndroidManifestã®android:hardwareAccelerated="true"ã¯æ£ã—ã記述ã•れã¦ã„ã‚‹ã®ã«ç™ºç”Ÿã—ãŸã€‚
ã“れã«ã¤ã„ã¦ã¯Unityã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’上ã’ãŸã‚‰è§£æ¶ˆã€‚
2017.4.10→NG
2018.1.1 →OK
ï¼’ï¼‰æ˜ åƒå†ç”Ÿå‰ã«ã¨ã¦ã‚‚ダサã„å†ç”Ÿãƒœã‚¿ãƒ³ãŒè¡¨ç¤ºã•れるå•題。
ã“れã¯videoã‚¿ã‚°ã®poster属性ãŒãªã„å ´åˆã«ãƒ‡ãƒ•ォルトã§å·®ã—è¾¼ã¾ã‚Œã‚‹ã‚‰ã—ã„。
Chromeブラウザã§ã¯è¡¨ç¤ºã•れãªã„ã®ã«WebViewã§è¦‹ã‚‹ã¨è¡¨ç¤ºã•れる。
消ã™ã«ã¯WebViewPlugin.javaã‚’æ›¸ãæ›ãˆã¦.jarをビルドã—ãªãŠã™å¿…è¦ãŒã‚る。
plugins/Android/src/net/gree/unitywebview/CWebViewPlugin.javaã‚’é–‹ãã€117行目ã‚ãŸã‚Šã‚’下記ã®ã‚ˆã†ã«å¤‰æ›´ã€‚
webView.setWebChromeClient(new WebChromeClient() {
 View videoView;
 //逿˜Žã®ç”»åƒã‚’è¿”ã™å‡¦ç†ã‚’追記
 @Override
 public Bitmap getDefaultVideoPoster() {
  return Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);
 }
ã‚ã¨ã¯ãƒ“ルドã—ã¦å‡ºæ¥ä¸ŠãŒã£ãŸplugins/Android/bin/WebViewPlugin.jarã‚’Unityã®Assets/Pluginsã«æŒã£ã¦ã„ãã ã‘。
ãƒ“ãƒ«ãƒ‰æ‰‹é †ã¯gree/unity-webviewã«æ›¸ã‹ã‚Œã¦ã„ã‚‹ãŒã€JDK10ã ã¨ä¸‹è¨˜ã®ã‚¨ãƒ©ãƒ¼ãŒå‡ºã¦ãƒ“ルドãŒé€šã‚‰ãªã„。
Could not determine java version from '10.0.1'
Gradleã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®å•題らã—ã„ãŒã€Gradleã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’変ãˆã¦ã†ã¾ãビルドã§ããªã‹ã£ãŸã®ã§ã€
JDK8をインストールã™ã‚‹ã“ã¨ã§å›žé¿ã€‚
サーãƒãƒ¼ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ãªã©ã§Webサーãƒãƒ¼ã‚’1時間ã»ã©æ¢ã‚ã‚‹ã¨ãã€ã¾ã£ãŸãレスãƒãƒ³ã‚¹ãŒãªã„ã¨åˆ©ç”¨è€…ãŒå›°ã‚‹ã®ã§
ã©ã®ãƒšãƒ¼ã‚¸ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã‚‚メンテナンス告知ページを表示ã™ã‚‹ã‚ˆã†ã«ã™ã‚‹ã€‚
具体的ã«ã¯ã€ã‚らã‹ã˜ã‚DNSã®TTLã‚’çŸãã—ã¦ãŠãã€ãƒ¡ãƒ³ãƒ†ã®éš›ã«ã‚½ãƒ¼ãƒªãƒ¼ã‚µãƒ¼ãƒãƒ¼ã®IPã«æŒ¯ã‚Šå‘ã‘る。
本番サイトã¯SSL化ã—ã¦ã„ãŸã®ã§ã€ã‚½ãƒ¼ãƒªãƒ¼ã‚µãƒ¼ãƒãƒ¼ã‚‚httpså—ã‘入れる想定。
ãã®ã‚½ãƒ¼ãƒªãƒ¼ã‚µãƒ¼ãƒãƒ¼ã‚’ç«‹ã¦ãŸæ™‚ã®ãƒ¡ãƒ¢ï¼š
1)ã•ãらã®ã‚¯ãƒ©ã‚¦ãƒ‰ã§ä¸€ç•ªå®‰ã„プランを契約ã—ã¦èµ·å‹•。環境ã¯CentOS6.9ã€Apache2.2
2)SSHã§ãƒã‚°ã‚¤ãƒ³ã—ã¦httpdインストール
yum -y install httpd
3)mod_sslをインストール
yum -y install mod_ssl
4)告知ページを作æˆã—ã¦ãƒ‰ã‚ュメントルートã«ä¿å˜
vi /var/www/html/maintenance.html
5)アパッãƒã®è¨å®šï¼ˆhttpã¯httpsã«é£›ã°ã™ã€‚ã©ã®URLã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã‚‚503ステータスã§ãƒ¡ãƒ³ãƒ†ãƒšãƒ¼ã‚¸ã«é£›ã°ã™ã€ãŸã ã—ç”»åƒã¯é™¤ã)
vi /etc/httpd/conf/httpd.conf
-------------------
ErrorDocument 503 /maintenance.html
NameVirtualHost *:80
NameVirtualHost *:443
<VirtualHost *:80>
ServerName twipla.jp
DocumentRoot /var/www/html
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
</VirtualHost>
<VirtualHost *:443>
ServerName twipla.jp
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /cert.pem
SSLCertificateKeyFile /privkey.pem
SSLCertificateChainFile /chain.pem
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !^(.*)\.(gif|png|jpg|jpeg)$ [NC]
RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteRule ^.*$ - [R=503,L]
</IfModule>
</VirtualHost>
-------------------
6)ssl.confã«ã‚‚書ã‹ãªã„ã¨ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã•れãªã„ã‹ã‚‚。
vi /etc/httpd/conf.d/ssl.conf
-------------------
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !^(.*)\.(gif|png|jpg|jpeg)$ [NC]
RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteRule ^.*$ - [R=503,L]
</IfModule>
-------------------
7)SSL証明書(cert.pemã€privkey.pemã€chain.pem)を本番環境ã‹ã‚‰ã‚³ãƒ”ーã—ã¦ãã¦httpd.confã§æŒ‡å®šã—ãŸå ´æ‰€ã«é…置。
8)httpsã§ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†443ãƒãƒ¼ãƒˆã‚’ã‚ã‘ã‚‹
vi /etc/sysconfig/iptables
-------------------
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
-------------------
9)iptableså†èµ·å‹•
/etc/init.d/iptables restart
1ï¼ï¼‰ã‚¢ãƒ‘ッãƒèµ·å‹•ã€è‡ªå‹•起動ON
service httpd start
chkconfig httpd on
以上ã§ã‚µãƒ¼ãƒãƒ¼ã®æº–å‚™ã¯å®Œäº†ã€‚
手元ã®ãƒ‘ソコンã®hostsãƒ•ã‚¡ã‚¤ãƒ«ã‚’æ›¸ãæ›ãˆã¦ã€ãƒ‰ãƒ¡ã‚¤ãƒ³åã§ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã¿ã¦å‹•作確èªã™ã‚‹ã€‚
å•題ãªã‘れã°ãƒ¡ãƒ³ãƒ†æ™‚ã«DNSã®IPã‚’æ›¸ãæ›ãˆã‚‹ã€‚
導入方法を検索ã—ãŸã‚‰å¤ã„æƒ…å ±ã‚‚å¤šãã¦æ‰‹é–“å–ã£ãŸã‘ã©ã€
ä¸‹è¨˜ã‚µã‚¤ãƒˆã«æƒ…å ±ãŒã¾ã¨ã¾ã£ã¦ã„る。インストールも簡å˜ã ã£ãŸã€‚
https://letsencrypt.jp/usage/#Install
ã¾ãšiptablesを変更ã—ã¦443ãƒãƒ¼ãƒˆã‚’空ã‘ã¦ãŠã
> vi /etc/sysconfig/iptables
> /etc/init.d/iptables restart
インストールã¯ä¸‹è¨˜ã ã‘ã§æ¸ˆã‚“ã 。
> sudo yum install epel-release
> wget https://dl.eff.org/certbot-auto
> chmod a+x certbot-auto
> ./certbot-auto
å¿…è¦ãªãƒ©ã‚¤ãƒ–ラリやPythonã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚‚自動ã§ã‚„ã£ã¦ãれる。
httpã‹ã‚‰httpsã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã™ã‚‹ã‹å°‹ãられãŸã®ã§yesã«ã—ãŸã‚‰ã€httpd.confã®VirtualHostè¨å®šã‚‚æ›¸ãæ›ãˆã¦ãれãŸã¿ãŸã„。
certbotã®standaloneプラグインã ã¨è¨¼æ˜Žæ›¸ç™ºè¡Œæ™‚ã«Webサーãƒã®åœæ¢ãŒç”Ÿã˜ã‚‹ã€‚
稼åƒä¸ã®ã‚µã‚¤ãƒˆãŒæ¢ã¾ã‚‹ã®ã¯å›°ã‚‹ã®ã§webrootプラグインを使ã†ã®ãŒè‰¯ã„。
証明書ã¯/etc/letsencrypt/archive内ã«ä¿å˜ã•れる。
シンボリックリンクãŒ/etc/letsencrypt/liveã«ä½œã‚‰ã‚Œã‚‹ã®ã§ã€httpd.confã«è¨˜è¿°ã™ã‚‹è¨¼æ˜Žæ›¸ãƒ•ァイルパスã¯ã“ã¡ã‚‰ã‚’使ã†ã€‚
証明書å–得時ã«ä½¿ç”¨ã—ãŸã‚ªãƒ—ションã¯ä¸‹è¨˜ã«ä¿å˜ã•れã¦ã€æ›´æ–°æ™‚ã‚‚ã“ã®è¨å®šãŒä½¿ã‚れる。
/etc/letsencrypt/renewal/****.conf
有効期é™ã®ç¢ºèªæ–¹æ³•
> openssl x509 -noout -dates -in /etc/letsencrypt/archive/ドメインå/cert1.pem
定期的ã«è¨¼æ˜Žæ›¸ã‚’æ›´æ–°ã™ã‚‹ãŸã‚ã«cronã«ä¸‹è¨˜ã‚’登録ã—ãŸã€‚
0 4 1,15 * * root /bin/certbot-auto renew --webroot-path /var/www/html --renew-hook "/etc/rc.d/init.d/httpd reload"
毎月1æ—¥ã¨15æ—¥ã«å®Ÿè¡Œã€/var/www/html/.well-known/acme-challenge内ã«ä¸€æ™‚ファイルãŒä½œã‚‰ã‚Œã¦ãれをèªè¨¼ã‚µãƒ¼ãƒãŒèªã¿ã«ãã¦èªè¨¼ã•れる。
--renew-hookã§è¨¼æ˜Žæ›¸æ›´æ–°æˆåŠŸæ™‚ã«httpdã®è¨å®šã‚’å†èªã¿è¾¼ã¿ã™ã‚‹ã‚ˆã†ã«ã—ãŸã€‚
蛇足:
稼åƒä¸ã®æœ¬ç•ªã‚µãƒ¼ãƒãƒ¼ã§ã„ããªã‚Šå®Ÿè¡Œã™ã‚‹ã®ã¯æ€–ã‹ã£ãŸã®ã§ã€å®Ÿéš›ã¯ä¸‹è¨˜ã®æ‰‹é †ã§è©¦ã—ãŸã€‚
・ã¡ã‚‡ã†ã©rsyncã§åŒæœŸã•ã›ãŸãƒ†ã‚¹ãƒˆã‚µãƒ¼ãƒ(ドメイン無ã—)ãŒã‚ã£ãŸã®ã§ãã¡ã‚‰ã§manualプラグインã§å®Ÿè¡Œã€‚
> ./certbot-auto certonly --manual -d example.com
・進ã‚ã‚‹ã¨ã€èªè¨¼ãƒ•ァイルåã¨ãã®ãƒ•ァイルã«è¨˜è¿°ã™ã‚‹èªè¨¼ã‚³ãƒ¼ãƒ‰ãŒè¡¨ç¤ºã•れるã®ã§æŒ‡ç¤ºé€šã‚Šã®URLã§ã‚¢ã‚¯ã‚»ã‚¹ã§ãã‚‹ã‚ˆã†æœ¬ç•ªã‚µãƒ¼ãƒã«ãƒ•ァイルを置ã。
・ENTERを押ã™ã¨ãã®ãƒ•ァイルã«WebアクセスãŒã‚りã€/etc/letsencrypt/ã«è¨¼æ˜Žæ›¸ãªã©ãŒç”Ÿæˆã•れる。
・証明書をテストサーãƒã«æŒã£ã¦ãã¦httpd.confã§SSL用ã®VirtualHostã‚’è¨å®šã€‚
・hostsãƒ•ã‚¡ã‚¤ãƒ«ã‚’æ›¸ãæ›ãˆã¦ãƒ‰ãƒ¡ã‚¤ãƒ³åã§ãƒ†ã‚¹ãƒˆã‚µãƒ¼ãƒã«ã‚¢ã‚¯ã‚»ã‚¹ã€‚æ£å¸¸ã«SSLãŒæ©Ÿèƒ½ã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã€‚
・本番サーãƒãƒ¼ã§webrootプラグインã§å®Ÿè¡Œã€‚
リップシンクãŒå…¨ç„¶å応ã—ãªã„ã“ã¨ãŒã‚る。
ã‚¹ã‚¯ãƒªãƒ—ãƒˆå®Ÿè¡Œé †ã®ãƒã‚°ã‚‰ã—ã„ã®ã§
OVRLipSync.csã«[DefaultExecutionOrder(-1)]を追記ã—ã¦è§£æ±ºã€‚
å‚è€ƒæƒ…å ±ï¼šhttps://twitter.com/youten_redo/status/984598867336282112
ã¾ãŸã€ãƒ•ォーカスãŒå¤–れるã¨ãƒžã‚¤ã‚¯åœæ¢ã™ã‚‹å‡¦ç†ãŒOVRLipSyncMicInputã«å…¥ã£ã¦ã„ã‚‹ã®ã§ã‚³ãƒ¡ãƒ³ãƒˆã‚¢ã‚¦ãƒˆã—ãŸã»ã†ãŒè‰¯ã„。
ãªã‹ãªã‹ãƒãƒ¼ãƒ‰ãƒ«ãŒé«˜ã„ã®ã§ã€ã¯ã¾ã‚Šãƒã‚¤ãƒ³ãƒˆã‚’メモã—ã¾ã™ã€‚
下記をå‚考ã«ã™ã‚Œã°ã¨ã‚Šã‚ãˆãšFaceRigã§å˜ç´”ã«3Dモデル表示ã™ã‚‹ã¨ã“ã‚ã¾ã§ã¯ã„ã‘る。
https://steamcommunity.com/sharedfiles/filedetails/?id=523433759
ã¾ãšãƒ¢ãƒ‡ãƒ«ã¯åŽŸç‚¹ã«é…ç½®ã€ã‚¹ã‚±ãƒ¼ãƒ«ã¯ï¼‘ã«ã—ãªã„ã¨ãƒœãƒ¼ãƒ³ã‚„カメラãŒãšã‚Œã‚‹ã€‚
é ã®ã‚µã‚¤ã‚ºã¯é«˜ã•ï¼’ã«åŽã¾ã‚‹ç¨‹åº¦ã«ã™ã‚‹ã€‚
(モデルã®ä½ç½®å›žè»¢ã‚¹ã‚±ãƒ¼ãƒ«ã‚’調整ã—ãŸå¾Œã§ã€ctrl+Aã§åŽŸç‚¹åŽŸå¯¸ã«å¤‰æ›ã§ãる)
マテリアルã®å‘½åè¦å‰‡ã‚’守る。例:smileyã¨å付ã‘ãŸã‚¢ãƒã‚¿ãƒ¼ã®faceマテリアルãªã‚‰ã€Œsmiley_sht_metalcloth_faceã€ã€‚
ãã®faceマテリアルã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ç”»åƒã®åå‰ã¯ã€Œsmiley_face_d.tgaã€ã¨ã™ã‚‹ã€‚テクスãƒãƒ£ç”»åƒã¯ãªãã¦ã‚‚å‹•ã。
ç”»åƒã¯TARGAå½¢å¼ã€ç¸¦ã¨æ¨ªã®pixelサイズã¯2ã®ç´¯ä¹—ã«ã™ã‚‹ã€‚
モデルã®UVマップを必ãšä½œã‚‹ã€‚
(Unwarpã¯ã€Edit Modeã§Aã‚ーã§å…¨ãƒ¡ãƒƒã‚·ãƒ¥é¸æŠžã—ã¦Uã‚ー)
一ã¤ã®ãƒ¡ãƒƒã‚·ãƒ¥ã«è¤‡æ•°ã®ï¼µï¼¶ãƒžãƒƒãƒ—ãŒã‚ã‚‹ã¨ã‚¨ãƒ©ãƒ¼ã«ãªã‚‹ã€‚
ï¼ˆãƒ¢ãƒ‡ãƒ«é¸æŠžã—ã¦Propertiesウィンドウã®Dataタブ内ã«UV Maps一覧ãŒã‚ã‚‹ã®ã§ä½¿ã‚ãªã„ã‚‚ã®ã¯å‰Šé™¤ã™ã‚‹ã€‚
複数ã®ï¼µï¼¶ã‚’使用ã—ãŸã„ã¨ãã¯ã€ï¼‘メッシュ1UVã«ãªã‚‹ã‚ˆã†ãƒ¡ãƒƒã‚·ãƒ¥ã‚’分割ã™ã‚‹ã€‚)
最低é™å¿…è¦ãªãƒœãƒ¼ãƒ³ã¯ã€BipHead , BipLEye , BipREye ã®ï¼“ã¤ã ã‘。
Armatureを作ã£ã¦Weightマップを作る。
ボーンåã«ãƒ‰ãƒƒãƒˆï¼ˆ . )をå«ã‚€ã¨ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚¨ãƒ©ãƒ¼ãŒèµ·ãる。
エラーãŒå‡ºã‚‹å ´åˆã¯ã€ãƒœãƒ¼ãƒ³ã‚’消ã—ã¦ã„ãæœ€ä½Žé™ã®ãƒœãƒ¼ãƒ³ã ã‘ã«ã—ã¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆæˆåŠŸã™ã‚‹ã‹ç¢ºèªã™ã‚‹ã¨ã‚ˆã„。
Cameraã¨ã„ã†åå‰ã®ãƒœãƒ¼ãƒ³ã‚‚å¿…è¦ã‚‰ã—ã„ãŒèªè˜ã•れãªã‹ã£ãŸã€‚代ã‚りã«Scene内ã«Cameraã¨ã„ã†åå‰ã®ã‚«ãƒ¡ãƒ©ãŒã‚れã°å¤§ä¸ˆå¤«ã€‚
ã‚¢ãƒã‚¿ãƒ¼ã®æ£é¢ã¨ã‚«ãƒ¡ãƒ©ã¯ã€Y軸(緑色ã®ç·š)ã§å‘ãåˆã†ã‚ˆã†ã«ã™ã‚‹ã€‚(一般的ã«å‰å¾Œã¯Z軸ã ã‘ã©ã€Blenderã§ã¯Yè»¸ãŒæ¨™æº–ã®æ¨¡æ§˜ï¼‰
カメラã®ä½ç½®ã¯ã‚µãƒ³ãƒ—ルアãƒã‚¿ãƒ¼ã‚’å‚考ã«åˆã‚ã›ã‚‹ã€‚
ã‚¢ãƒã‚¿ãƒ¼ã®å‹•ãã¯ã€æ§˜ã€…ãªã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’用æ„ã™ã‚‹ã“ã¨ã§å®Ÿç¾ã™ã‚‹ã€‚
最低é™å¿…è¦ãªã®ã¯ã€Œidle1ã€ã®ã¿ã€‚DopeSheetã®ActionEditorã§idle1ã¨å付ã‘ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’作る。
ã‚ãƒ¼ãƒ•ãƒ¬ãƒ¼ãƒ ã‚’é¸æŠžã—ã¦Keyメニュー→Sample keyframe(ã‚ーフレームを抽出)を実行ã—ã¦ã€
全フレームã«ã‚ーを打ãŸãªã„ã¨FaceRigå´ã§æ£ã—ãアニメーションã•れãªã„ケースãŒã‚る。
下記ã®ãƒ¢ãƒ¼ã‚·ãƒ§ãƒ³ã‚’用æ„ã™ã‚Œã°ãれãªã‚Šã«å‹•ãã¨æ€ã†ã€‚
idle1 待機
Head_LR 首を左å³ã«æ›²ã’る ï¼(å·¦)~15(ä¸å¤®)~30(å³)ã®31フレームã§ä½œæˆã€‚
Head_UD 首を上下ã«å‘ã‘ã‚‹
Head_Twist 首を左å³ã«æŒ¯ã‚‹
LeftEyeClosed 左目を閉ã˜ã‚‹
RightEyeClosed å³ç›®ã‚’é–‰ã˜ã‚‹
ã‚¢ãƒã‚¿ãƒ¼ã®è…•ã¯ã€Shift+マウスドラッグã§å‹•ã‹ã›ã‚‹ã€‚モーションã¯ä¸‹è¨˜ã‚’用æ„ã™ã‚‹ã€‚
HandL_closeDown_LR 左腕ã€ä¸‹ã’ãŸã¾ã¾å·¦ã‹ã‚‰å³ã«æŒ¯ã‚‹ã€‚ï¼(å·¦)~15(基本ãƒãƒ¼ã‚º)~30(å³)
HandL_closeMiddle_LR 左腕ã€èƒ¸ã®ä½ç½®ã§å·¦ã‹ã‚‰å³ã«æŒ¯ã‚‹ã€‚ï¼(å·¦)~30(å³)
HandL_closeUp_LR 左腕ã€é ã®ä½ç½®ã§å·¦ã‹ã‚‰ä¸Šã«æŒ¯ã‚‹ã€‚ï¼(å·¦)~30(å³)
※HandL_closeUp_LRãŒåæ˜ ã•れãªã„å ´åˆã¯HandL_farUp_LRã«å‰²ã‚Šå½“ã¦ã¦ã¿ã‚‹ã€‚
å£ã®å‹•ãã¯ä¸‹è¨˜ãŒã‚ã‚‹ã¨ã‚ˆã„。
MouthOpen å£ã‚’é–‹ã‘る。0(é–‰ã˜ã‚‹)~30(é–‹ã‘ã‚‹)
MouthOpen_base å£ã‚’é–‹ã‘ã£æ”¾ã—。0~30ã¾ã§åŒã˜ã€‚
Mouth_pursedLips_LR 唇をã™ã¼ã‚る。ï¼(å·¦ã§ã™ã¼ã‚ã‚‹)~15(ä¸å¤®ã§)~30(å³ã§)
MouthClosedLeft_U å·¦ã€å£è§’を上ã’ã¦ç¬‘ã†
MouthClosedRight_U å³ã€å£è§’を上ã’ã¦ç¬‘ã†
Blenderã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’Colladaå½¢å¼ã§æ›¸ã出ã™ã€‚
ファイルåã«ã€ŒGeometry.daeã€ã‚’ã¤ã‘る。例:smileyGeometry.dae
アニメーションã¯ãれãžã‚Œã®åå‰ã§æ›¸ã出ã™ã€‚例:idle1.dae
ファイルパスã«ã€ã‚¹ãƒšãƒ¼ã‚¹ã‚„ãƒã‚¤ãƒ•ンãŒã‚ã‚‹ã¨èªã¿è¾¼ã‚ãªã„。
FaceRigã®ã‚¤ãƒ³ãƒãƒ¼ã‚¿ãƒ¼ã¯ä¸‹è¨˜ã«ã‚ã‚‹ã®ã§èµ·å‹•ã—ã¦ã€Data Folderを指定ã—ã¦Import実行。
C:\Program Files (x86)\Steam\steamapps\common\FaceRig\Bin\Tools\ImportWizardNew
インãƒãƒ¼ã‚¿ãƒ¼ã‹ã‚‰ä¸€åº¦æ›¸ã出ã—ãŸãƒ‡ãƒ¼ã‚¿ã¯ã€ã‚¤ãƒ³ãƒãƒ¼ã‚¿ãƒ¼ä¸Šã§ã‚¯ãƒªã‚¢ã—ã¦ã‚‚消ãˆãªã„よã†ãªã®ã§
é–“é•ã£ãŸã‚¢ãƒ‹ãƒ¡ãŒæ®‹ã‚Šç¶šã‘ã‚‹å ´åˆã¯ã€ä¸‹è¨˜ã«ã‚ã‚‹ã‚¢ãƒã‚¿ãƒ¼ãƒ‡ãƒ¼ã‚¿ã‚’消ã™ã¨è‰¯ã„。
C:\Program Files (x86)\Steam\steamapps\common\FaceRig\Mod\VP\PC_CustomData\Objects
FaceRigã®LAUNCHボタンã§ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã™ã‚‹ã‚ˆã†ã«ãªã£ã¦ã—ã¾ã£ãŸã¨ãã¯ã€å‰è¿°ã®ã‚¢ãƒã‚¿ãƒ¼ãƒ‡ãƒ¼ã‚¿ã‚’消ã—ã¦
OPTIONSã§Reset to Defaultsを押ã—ã¦ã¿ã‚‹ã¨ç›´ã‚‹ã‹ã‚‚。
ç§ã®ç’°å¢ƒã§ã¯ãƒžãƒ«ãƒãƒ¢ãƒ‹ã‚¿ãƒ¼ï¼ˆå¤–部ディスプレイ接続ä¸ï¼‰ã§LAUNCHボタン押ã™ã¨ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã™ã‚‹ã€‚
Qã‚ー押ã—ãŸã¨ãã«ç™ºå‹•ã™ã‚‹special01ãªã©ã®ç‰¹æ®Šã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã«ã¤ã„ã¦ã¯
special01ã ã‘ã§ãªãベースã¨ãªã‚‹idle1ã€Avatar_LRã€Avatar_FBã®å…¨ãƒœãƒ¼ãƒ³ã«ã‚ーフレームを打ã£ã¦ãŠã‹ãªã„ã¨ã‚¢ãƒã‚¿ãƒ¼ãŒæ¶ˆãˆã‚‹ã€‚
å‚考:
ã°ã‘ã‚‚ã®å±‹ -BAKEMONOYA- faceRigç·¨
アニメテンプレート一覧
https://www.youtube.com/watch?v=ecLd4NsmpUw
サンプルアãƒã‚¿ãƒ¼ã€Œyexampleã€ã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰
ã„ã‚ã„ã‚試ã—ãŸçµæžœã®ãƒ¡ãƒ¢ï¼š
WebSocketãªã‚‰ã€€http://sta.github.io/websocket-sharp/ ãŒè‰¯ã„。
OSXã¨iOSã§ws://echo.websocket.orgã«æŽ¥ç¶šã§ãã‚‹ã“ã¨ã‚’確èªã—ãŸã€‚
ã—ã‹ã—ã€wssã§ã¯æŽ¥ç¶šã§ããªã‹ã£ãŸã€‚Socket.ioサーãƒã«ã‚‚接続ã§ããªã‹ã£ãŸã€‚
Socket.ioã§ã®æŽ¥ç¶šã¯ã€€https://github.com/floatinghotpot/socket.io-unity ãŒè‰¯ã„。
OSXã¨iOSã§æŽ¥ç¶šã§ãã‚‹ã“ã¨ã‚’確èªã—ãŸã€‚
ãŸã ã»ã‹ã®ãƒ©ã‚¤ãƒ–ラリã¨ç«¶åˆã—ã¦ã€The imported type `xxx' is defined multiple times ã¿ãŸã„ãªã‚¨ãƒ©ãƒ¼ãŒå‡ºã‚‹å ´åˆã¯å¯¾ç–ãŒå¿…è¦ã€‚
ã©ã¡ã‚‰ã‹ã®Actionã‚’UnityActionã«å¤‰ãˆã‚‹ã¨ã‹ã€‚Func<T, TResult>を自分ã§ç”¨æ„ã—ãŸdelegateã«å¤‰ãˆã‚‹ã¨ã‹ã€‚
https://github.com/floatinghotpot/socket.io-unity/issues/1
下記も試ã—ãŸãŒã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå¤ã„ã›ã„ã‹æŽ¥ç¶šã§ããªã‹ã£ãŸã€‚
https://github.com/NetEase/UnitySocketIO
https://github.com/kaistseo/UnitySocketIO-WebSocketSharp
https://github.com/fpanettieri/unity-socket.io-DEPRECATED
å‚考:
http://littlewing.hatenablog.com/entry/2015/10/05/144124