Skip to content

Instantly share code, notes, and snippets.

@tsubaki
Last active August 29, 2015 14:12
Show Gist options
  • Save tsubaki/1d6af8e47c5eb026355b to your computer and use it in GitHub Desktop.
Save tsubaki/1d6af8e47c5eb026355b to your computer and use it in GitHub Desktop.
ピクセルアート的なのをスクリプトベースで
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