【スポンサーリンク】

【CodeIgniter】Hostingerのレンタルサーバで.htaccess設定

Hostingerのレンタルサーバは.htaccessが使えると公式で言っているので、CodeIgniterのindex.phpを消すためにいつもの.htaccessを使ってみたがうまくいかなかった。

いろいろと探してみたところ、次の.htaccessを使えばうまく動作することが分かった。

RewriteBase /
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/system.*
RewriteRule ^(.*)$ index.php?/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?/$1 [L]

【Unity5】Standard Assetsで三人称視点のキャラクターをコーディングなしで作成する

準備

メニューのAssets → Inport Packageから下記をインポートする。

  • Cameras
  • Characters
  • Prototyping(動作確認用)

f:id:Phalusamil:20151014061806p:plain

次にProjectのAssets → Standard Assets → Characters → ThirdPersonCharacter → PrefabsからThirdPersonControllerをシーンに追加する。

f:id:Phalusamil:20151014061832p:plain

そして動作確認用に床が必要なのでAssets → Standard Assets → Prototyping → PrefabsからFloorPrototype64x01x64を設置する。

f:id:Phalusamil:20151014061843p:plain

最後に、カメラを設置するのでmain cameraをシーンから消して準備完了。

(以下視点操作の方法で実装が分岐します。)

マウスによる視点操作の場合

Assets → Standard Assets → Cameras → PrefabsからFreeLookCameraRigをシーンに追加する。

f:id:Phalusamil:20151014061941p:plain

そしてFreeLookCam(Script)コンポーネントのパラメータを次のようにする。

f:id:Phalusamil:20151014061901p:plain

TargetをThirdPersonControllerにし、Move Speed、Turn Speed、Turn Smoothingの三つを調整する。
Move Speedはカメラの追従速度。
Turn Speedはマウスを動かした際のカメラの回転量。
Turn Smoothingはカメラの回転速度。大きな値、または0にすればマウスを動かした分だけ瞬時に回転する。

なおLock Cursorにチェックを入れれば、実行中はマウスカーソルが動かなくなる。(※下記のサンプルはチェックなし)

サンプル

f:id:Phalusamil:20151014061917g:plain

自動的に視点変更する場合

Assets → Standard Assets → Cameras → PrefabsからMultipurposeCameraRigをシーンに追加する。

f:id:Phalusamil:20151014062158p:plain

そしてAutoCam(Script)コンポーネントのパラメータを次のようにする。

f:id:Phalusamil:20151014062633p:plain

TargetをThirdPersonControllerにし、Move Speed、Turn Speed、Spin Turn Limitの三つを調整する。
Move Speedはカメラの追従速度。
Turn Speedはカメラの回転速度。
Spin Turn Limitはカメラが一度に回転する角度の上限。360にしておけばスムーズに動く。

サンプル

f:id:Phalusamil:20151014062223g:plain

参考文献

Standard Assets全般について以下のサイトを参考にしました。tsubakit1.hateblo.jp

はてなブログのSEOが強すぎて驚いた話

※注意書き

色々なブログシステムで検証を行ったわけではありません。

私の体感で「はてブロのSEOすげぇ」と思っただけです。

本題

前日、こんなタイトルの記事をはてなブログに投稿しました。

【Unity 2D】あるオブジェクトを指定オブジェクトの方向に向ける - 備忘録

この記事を投稿してから5分後くらいに、なんとなくタイトルをコピペしてgoogle検索したところ、

すでに一番上に表示されていた

という事件(?)が発生しました。

ブログ初心者の私は、

「おー最近のブログシステムはすごいんだなぁ。」

くらいにしか思いませんでしたが、5時間後くらいに

「・・・普通に検索しても上位にくるのか?」

と気になったので検証してみました。

まずはこんな感じに検索。

「unity 2d オブジェクト 向ける」

結果は・・・

f:id:Phalusamil:20151003113740p:plain

おーすごい。(母数たったの11000件ですが。)

あとは単語削ったり変えたりしてみました。

「unity オブジェクト 向ける」 → 6位
「unity 2d 向ける」 → 3位
「unity 向ける」 → 8位
「unity 2d オブジェクト 向きを変える」 → 10位

ヒットしたページの母数は数万件程度ですが、なかなかの結果です。

やはり、

記事を投稿した日に上位にくる

ってところが良いですね。

ただし、
単純に私がブログとかSEOに詳しくないだけでこんなの当たり前
という可能性も十分にあるので悪しからず。

【Unity 2D】あるオブジェクトを指定オブジェクトの方向に向ける

要約

下記のメソッドを使えばOK

Vector2 Aim(GameObject rotationObject, GameObject targetObject, float angleOffset) {
	Vector3 posDif = targetObject.transform.position - rotationObject.transform.position;
	float angle = Mathf.Atan2(posDif.y, posDif.x) * Mathf.Rad2Deg;
	Vector3 euler = new Vector3(0, 0, angle + angleOffset);
	
	rotationObject.transform.rotation = Quaternion.Euler(euler);
	
	return posDif.normalized;
}

仕様

引数
  • rotationObject: 回転させたいオブジェクト
  • targetObject: ターゲットとなるオブジェクト
  • angleOffset: 角度補正値 ※1

このメソッドの効果

rotationObjectがtargetObjectの方向に向く

返り値について

rotationObjectからtargetObjectへの単位方向ベクトルが返される。
このベクトルはrotationObjectからtargetObjectに向けて何かを動かしたいときに使える。

※1 角度補正値(angleOffset)について

例えば下記二つのSpriteオブジェクト(矢印の画像)に上記のメソッドを適用することを考える。

f:id:Phalusamil:20151001160443p:plainこちらの画像は角度補正値を0にすると正しい方向に向く

f:id:Phalusamil:20151001160447p:plain一方こちらの画像は角度補正値を−45にする必要がある

角度補正値をこれらの値に設定する理由は、角度の基準が次のようになっているためである。

f:id:Phalusamil:20151001160400p:plain

なので、0度に合わせる必要がある。

f:id:Phalusamil:20151001160345p:plain

その昔、デザイナーが描いた弓矢の画像が135度くらいを向いていたが、このメソッドのおかげで元画像を修正する手間が省けた記憶がある。

MySQLで高速にランキングを求める

例えば下記のようなテーブルがあったとして、ハイスコアの上位ランキングや指定idのランキングを取得したい場合がある。

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `highscore` int(11),
  PRIMARY KEY (`id`),
  KEY `highscore` (`highscore`)
);

いつもはバッチ処理してランキング用のテーブルを用意していたが、ふとMySQLだけで高速にランキングを求められないものかと思ったので色々探してみた。

まずは、こちらの記事の早い版と書かれている方法が高速で良い感じだった。

MySQL - SQL 合計値からランキングを取得する例 - Qiita

しかし同点(同順位)は考慮されていなかったので、今度はこちらを参考にしたクエリを使ってみた。

mysqlだけでランキングしてみる(同率考慮) - Qiita

この方法で約130万件のテーブルに対して上位100件を取得してみると約1秒かかった。規模が小さいうちなら問題なさそう。
しかし、アプリやサービスの規模が大きくなってくるとバッチ処理を作らねばならない可能性がある結果となった。

というわけでかなり無茶なやり方だけど高速にランキングを求めるクエリを書いてみた。
ユーザー定義変数の処理順に注目し、一つ前のハイスコアの値を参照することによって同順位かどうかをチェックしている。

select id, highscore, rank from (
  select
  @p:=@a,
  case
    when @p = highscore then @c
    else @c:=@c+@s
  end as rank,
  case
    when @p = highscore then @s:=@s+1
    else @s:=1
  end as S,
  id, highscore, @a:=highscore from (
    select @c := 1, @a := null, @s := 0)
  AS dummy,
  test order by highscore desc limit 100
) as tmp;

この方法だと約130万件のテーブルに対する上位100件の取得にかかる時間は0.01秒未満となった。満足。

また、特定のidのランキングを調べたい場合は、

select id, highscore, (
  select count(*)+1 from test as t2
  where t2.highscore > t1.highscore) as rank
from test as t1
where id = ○○;

とやると速い。こちらの方法は

順位の取得 - MySQL | 教えて!goo

を参考にした。

テストデータについては

MySQLで簡単にランダムなテストデータを作成する方法 - Qiita

を参考にして作成した。

余談

上位ランキングを取得する高速なクエリを指定idのランク取得クエリに書き換えたり、指定idのランクを取得する高速なクエリを上位ランキングを取得するクエリに書き換えると、なぜかとても遅くなる。謎。

【スポンサーリンク】