記事一覧

【Unity】低解像度でレンダリングしてスクリーンサイズに拡大表示する方法

ファイル 129-1.jpg

Unityでドットゲーム作りたい……でもUnityにはドットという単位がないので、
半ドットズレた絵が出来上がったりしてきもちわるい……
という問題点があるんですが、一応解決策を見つけました。
低解像度でレンダリングして、それをウィンドウサイズに拡大して表示しています。
レトロ調なゲームを作るときに役立つでしょう。

それがこのプロジェクトデータです。(Unity5.4.2f2で作成)
http://deathmofumofu.sakura.ne.jp/unity/lowres/lowreso_render.zip

これを見ながら解説していきます。

 

(1)カメラのレンダリング先をRenderTextureにする

カメラで映した景色は基本的にはスクリーンに直接レンダリングするようになっていますが、
それをスクリーンではなく別の平面にレンダリングする機能がRenderTextureです。
オフスクリーンレンダリングともいいます。

そしてその平面は解像度を自由に指定できます。
つまりこのRenderTextureを意図的に低解像度にすることによって、
ドットドットした見た目の絵を作ることが出来ます。

まず、Projectウィンドウ内で右クリック→Create→Render Texture

作成したRenderTextureの解像度をインスペクタ上で決めます。サンプルでは128*72にしています。
また、ドットをぼやけさせたくないのでFilter Modeはpointにします。

そのRenderTextureを、Hierarchyウィンドウ内のカメラにレンダーターゲットとして放り込みましょう。

キャラクター用のMain Cameraと、背景用のBG cameraがあるので、両方に放り込んでいます。

 

(2)RenderTextureをOnGUIで画面全体に描画する

メインカメラの描画先がRendertextureになったので、スクリーンに映し出すものがなくなってしまいました。
なので、それ用のカメラを作ります。Finalcameraとでもしといてください。
そして(1)で作った絵をそのカメラで画面全体に表示させます。C#スクリプトでやります。

using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class finalrender : MonoBehaviour {

public RenderTexture scr;
void OnGUI()
{
GUI.DrawTexture(new Rect(0,0,Screen.width,Screen.height),scr,ScaleMode.ScaleToFit,true);
}

}

Finalcameraにこれを適用して、scrのところにインスペクタ上でさっき作ったRenderTextureを入れます。

 

(3)カメラの投影方法をOrthographicにして、Sizeを適切な値にする

2Dを表示させるなら、カメラの設定はOrthographic(平行投影)の方がいいです。詳しくはググれ。
そしてここでキモとなるのがSizeの値です。

画像をSpriteとして設定するときに、Pixels per Unitという値を決めるところがあるんですが、
その値と、カメラのSizeの値の兼ね合いによって、そのSpriteが画面上でどのくらいの大きさで表示されるかが決まります。
Pixels per Unitはめんどくさいのでデフォルトの100のままにしときましょう。

Rendertextureの高さ ÷ 2 ÷ Pixels per Unit = カメラのSize

もうなんも考えず↑の式で計算してください。
RenderTextureの高さが72で、Pixel per Unitが100なら、72/2/100=0.36となります。
なので、今回はカメラのSizeを0.36にすればドットバイドットになります。

RenderTextureの解像度をちょっと上げて高さ240にしたなら、240/2/100=1.2ですね。

ちなみにこれはOrthographic設定のMain Cameraの話で、3D表示のためにPerspective設定にしてあるBGcameraは無関係です。
BGcameraのほうはたぶん計算式とか無いと思います。気合で合わせてください。ぼくも目分量でやりました。

 

(4)スプライトのシェーダーの『pixel snap』をONにする

pixel snapとはたぶんドットを矯正して表示することだと思うんですが、
これをONにするとズレることなくきれいな表示になります。

しかし、Projectウィンドウからhierarchy内にドラッグして置いたSpriteは、
Sprite-Defaultというマテリアルになっていて、ONに出来ません。

なので新しくMaterialを作成し、全てのspriteに適用します。


こうです。

はいできた。

かなり駆け足で説明しましたので言葉足らずのところもあるかと思いますが
そこはデータを見て各自あれしてください。
何かあったらコメント欄かネコ忍者のツイッターまでどうぞ。

ネコネイビー

日記っていうか年記というか隔年記となりつつあるぞ。
サークルとして大きな変化があったので一応貼っておきます!

それは当サークル初の有料ゲーム『ネコネイビー』の完成、配信です!

ネコネイビー

いままでのデスモフモフのゲームとは比べ物にならないほどのボリューム感と作り込みを実現!
ぜひとも遊んでね

カラス

カラスにはまった。

ソードでバシバシ殴りながらDFS繋げていく爽快感。
ストーリーもかなり厨二で謎めいた感じで、更に興味がわいてくる。

やっぱ、ソード+弾消し有りのシューティングが僕のドストライクゾーンらしい。

キヨミズ!

ファイル 114-1.jpg

一日でデスモフモフのアクセスカウンタが1000回った(驚愕)3年かけて4000弱だったのに(それはそれでしょぼいと思うぞ)

というのも昨日、ニンジャスレイヤーの二次創作ゲーム【バリキ・ジャンプ】を公開したのであります。
イグゾーション=サンが部下のクラミドサウルス=サンにバリキ充填し、キョート城から大ジャンプさせ爆発四散させる
というサツバツゲームです。ヤッテミテネ!!!

で、

それがなんかの拍子に大拡散してしまい、かなりの方に#バリキジャンプタグでプレイ報告をして頂けた!
たくさん感想が書いてあって実際ヤバイうれしみがかいはつチームを襲った。かいはつチームは一人だ。

驚いたのはスコアの暴れようで、自分の手元ではまー1000も飛んだらキンボシ・オオキイだろ!!
とかタカをくくっていたところ、フタを開けて見たら2000オーバーの記録がひしめき合うマッポーの様相を呈していた。
最初のバージョンでは1500以上飛ぶと背景のグラデーションがなくなっちゃうので急いで修正した。

さらには逆走を試み、スタート地点のイグゾーション=サンを飛び越える人まで現れた。
どうやらブロックへの跳ね返り際にブーストをかけると左に飛ぶらしい。テストに出ないよぉ……
(クラミドサウルス=サンの挙動は物理エンジンに任せっきりなのでまさかそんな現象が起こるとは思わなかった)
こんなのってないぞ……ヘッズいい加減にしろよ……
【モクフォース】の時も、【呪いの館EX】の時も毎回自分の想定した限界をやすやすと突破されて「ファッ!?」って
言わされてる気がするので、そろそろ開発者側からの一転攻勢をかけたいところである……のだが

でも相当遊び尽くして頂けたようだし、開発における新たな教訓も沢山追加されたし、
Unity4の先進機能もそこそこ習得したし、かなりの収穫があったといえる!!

皆様お付き合い頂きありがとうございました。

モクモク

あ、そうだ(唐突)
こないだ公開したモクフォースが雑誌に載るそうです。
晋遊舎さんの『iP!』6号、フリーゲーム特集だそうです。
見本紙を頂けるようで楽しみです。ありがとうございにゃんす!

アジャー

またたび屋敷さんに
うちのうどん侍をブログで紹介して頂いちゃいました!
アッー!アワワワワ!未完成ではずかしいです!
ありがとうございました。
デスモフモフの次回作にご期待ください。

モケ

コミトレ21で新作『モクフォース unlockα』を頒布しました!
手に取ってくださった皆さんありがとうございました。

ニャウニャウ

ヤッベ書くの忘れてた
きょう、関西コミティア41にて、モクモクレン体験版 バージョン0.28を配布しました。
手にとってくださった皆様どうもありがとうございました。
ご意見ご感想などありましたらここのコメント欄やネコ忍者コアのtwitterアカウントへどうぞ!

【Unity】にょろにょろしっぽ作ってみた

ファイル 75-1.jpg

UnityでR-typeのインスルーみたいな長いしっぽを持った敵を作るスクリプトを考えた。
しかもかんたん。

WebPlayerとコードはこ↑こ↓

決め手は、yield WaitForSeconds(秒数);
「現状の頭の座標を0.1秒後にしっぽの関節iに適用」という命令を毎フレーム実行してやると、
頭に常に0.1秒遅れて追従するしっぽが出来る。あとは関節の数だけそれを繰り返してやるだけ。

今日出勤前の歯磨き時にひらめいて、実際作ってみたら全てうまく行ったという奇跡めいた出来事だ。

今回注意したいのは、グラディウスのオプションのようにはならないこと。
グラディウスは頭が止まると関節の動きも止まるが、
この方法だと止め方が存在しないので停止している頭の位置に向かって関節が収束してしまう。
つまり常に動き続けているヘビ型キャラにだけ使える技だってことだ。

頭が止まっているあいだ関節も止めたければ、一般的な追従オブジェクトの組み方である
『頭の座標を数十フレームほど配列に常時記憶しておき、関節の座標を配列の途中から取り出す』
(止めるときは取り出すのをやめる)というやり方をとる他ないのではないかと思う。
そんな処理をする価値のあるキャラクターかどうか?って所と相談してどちらの方法を採るか決めるべきであろう。

ページ移動

  • 前のページ
  • 次のページ