Last active
August 29, 2015 14:12
-
-
Save tsubaki/1d6af8e47c5eb026355b to your computer and use it in GitHub Desktop.
ピクセルアート的なのをスクリプトベースで
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
using System.Collections; | |
using UnityEngine.UI; | |
using System.Linq; | |
using System; | |
[RequireComponent(typeof(Canvas), typeof(CanvasScaler), typeof(RectTransform))] | |
public class Main : MonoBehaviour { | |
RectTransform[] layers; // 描画優先度のレイヤー | |
int layerCount = 3; // レイヤー枚数 | |
void Start () | |
{ | |
// ----------------------------------------------- | |
// 画面のレイアウトを決定。 | |
// 普通ならSceneで調整しておくと楽 | |
// ----------------------------------------------- | |
var resolution = new Vector2(64,48); | |
// 想定解像度を設定し、レターボックスにする | |
// http://tsubakit1.hateblo.jp/entry/2014/12/11/223427 | |
var canvasScaler = GetComponent<CanvasScaler>(); | |
canvasScaler.referenceResolution = resolution; | |
canvasScaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize; | |
canvasScaler.screenMatchMode = CanvasScaler.ScreenMatchMode.Expand; | |
var screen = new GameObject("screen", typeof(RectTransform), typeof(Mask), typeof(Image)).GetComponent<RectTransform>(); | |
screen.SetParent(transform, false); | |
screen.sizeDelta = resolution; | |
// ----------------------------------------------- | |
// レイヤーの作成 | |
// 親オブジェクトを作っておき、描画順の制御を楽にする | |
// アンカーは左下に設定(左下が0,0) | |
// ----------------------------------------------- | |
layers = new RectTransform[layerCount]; | |
for(int i=0; i<layerCount; i++) | |
{ | |
var layer = new GameObject("layer" + i, typeof(RectTransform)); | |
var rectTransform = layer.GetComponent<RectTransform>(); | |
layers[i] = rectTransform; | |
rectTransform.SetParent(screen, false); | |
rectTransform.sizeDelta = resolution; | |
rectTransform.pivot = new Vector2(0, 0); | |
rectTransform.anchorMax = rectTransform.anchorMin = new Vector2(0, 0); | |
} | |
// ----------------------------------------------- | |
// スプライトをResourcesから読込 | |
// http://tsubakit1.hateblo.jp/entry/20131222/1387654182 | |
// スプライトはpngから動的に作っても良いけど、pngからGPUで使えるデータに変換するのは | |
// 事前に変換済みのデータを使うResourcesと比較して5000倍くらい時間かかる | |
// http://tsubakit1.hateblo.jp/entry/20131223/1387770779 | |
// ----------------------------------------------- | |
var sprite = Array.Find<Sprite>(Resources.LoadAll<Sprite>("hone"), item => item.name == "hone_0"); | |
var sprite2 = Array.Find<Sprite>(Resources.LoadAll<Sprite>("image021"), item => item.name == "image021_5"); | |
// ----------------------------------------------- | |
// イメージの元となるImageを作成する | |
// アンカーの設定等、重複部が多いのでここで一括でやってしまう。 | |
// 本来ならprefab作っておくだけでいい | |
// ----------------------------------------------- | |
var image = new GameObject("image template", typeof(Image)).GetComponent<Image>(); | |
image.gameObject.SetActive(false); // 特に使う訳では無いので、検索からもヒットしないようにしておく | |
image.rectTransform.pivot = new Vector2(0, 0); | |
image.rectTransform.anchorMin = image.rectTransform.anchorMax = new Vector2(0, 0); | |
// ----------------------------------------------- | |
// 実際にスプライトを配置 | |
// 事前にスプライト登録も含めてprefab登録しておけば、 | |
// Instantateして座標調整するだけで使える。 | |
// 描画順はSetAsFirstSiblingやSetSiblingIndex、あとレイヤー(親オブジェクト)で設定する。 | |
// ----------------------------------------------- | |
// imageにスプライトを登録し画像からサイズを決定する | |
// 何となく何度も実行するのが嫌なので、頭で1回実行 | |
image.sprite = sprite; | |
image.SetNativeSize(); | |
// イメージを量産 | |
CreateImageFromImagebase(image, new Vector2(5, 0), 1); | |
CreateImageFromImagebase(image, new Vector2(7, 0), 1); | |
CreateImageFromImagebase(image, new Vector2(3, 0), 1).rectTransform.SetAsFirstSibling(); | |
// imageのスプライトとサイズを更新して、イメージ量産 | |
image.sprite = sprite2; | |
image.SetNativeSize(); | |
CreateImageFromImagebase(image, new Vector2(12, 20), 2); | |
CreateImageFromImagebase(image, new Vector2(0, 0), 0).rectTransform.SetAsFirstSibling(); | |
// 後片付け | |
Destroy (image); | |
} | |
Image CreateImageFromImagebase(Image imagebase, Vector2 pos, int layer) | |
{ | |
var image = GameObject.Instantiate(imagebase) as Image; | |
image.rectTransform.SetParent(layers[layer], false); | |
image.rectTransform.anchoredPosition = pos; | |
image.gameObject.SetActive(true); | |
return image; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment