LoginSignup
1
0

More than 3 years have passed since last update.

UNITYでSpriteRendererを雑にImageへ変換

Posted at

初記事で雑なソースコードを載せます。

アセットで試しに購入した2D画像メーカを購入した(Animate SD Girl Character)
SDのキャラを髪や表情を差し替えて色々と作れるアセットでアニメーションが数パターン用意されていて10$
といった安さだったので試しに使ってみようと思って購入。
Animate SD Girl Character

ただこちらのアセットSpriteRendererで作られていたので最初ポジションをみながら使用する画像を切り替えてとちまちま作業していたのですが、
ふとコピーして一括でImageに差し替えたほうが早くねぇと半日遅れで気づいたので簡単に作成!!
ぶっちゃけちゃんとした変換作るならZ座標みながら前後の設定をすべきだと思うけどそこに関しては手作業で簡単に思いつかなかったので本当に雑な変換になります。
アニメーション関係とあと実際のゲーム内でちゃんと表示も確認していない不十分なソースになります。
あとリファクタリング・・・ちゃんとしないとな

[MenuItem("GameObject/SpriteRendereToUGUI", false, 20)]
/// <summary>
/// SpriteRendererをUGUIのImageに変換
/// </summary>
public static void SpriteRendereToUGUI()
{
    canvasRect = GameObject.Find(CanvasRootPath).GetComponent<RectTransform>();
    var gameObject = Selection.activeGameObject;
    if (gameObject != null)
    {
        var createObject = CopyObject(gameObject);
        createObject.transform.SetParent(canvasRect, false);
        GetAllChildlen(createObject, SetNativeSize);
    }
}


[MenuItem("GameObject/AllSetNativeSize", false, 30)]
/// <summary>
/// 選択中のオブジェクトのImageを一括でサイズ初期化を行う。
/// </summary>
private static void SetAllNativeSize()
{
    var gameObject = Selection.activeGameObject;
    GetAllChildlen(gameObject, SetNativeSize);
}

/// <summary>
/// オブジェクトにImageがついている場合サイズを初期化する
/// </summary>
/// <param name="obj"></param>
private static void SetNativeSize(GameObject obj)
{
    if (obj == null)
    {
        return;
    }
    var image = obj.GetComponent<UnityEngine.UI.Image>();
    if (image != null)
    {
        image.SetNativeSize();
    }
}

/// <summary>
/// 子オブジェクトを検索して見つかったらコールバックで返す。
/// </summary>
/// <param name="parentObj"></param>
/// <param name="callback"></param>
private static void GetAllChildlen(GameObject parentObj, UnityAction<GameObject> callback)
{
    var image = parentObj.GetComponent<UnityEngine.UI.Image>();

    foreach (Transform child in parentObj.GetComponentInChildren<Transform>())
    {
        GetAllChildlen(child.gameObject, callback);
    }
    callback(parentObj);
}

private static GameObject CopyObject(GameObject targetObj)
{

    GameObject createObject = CreateCopyGameObject(targetObj);
    foreach (Transform child in targetObj.GetComponentInChildren<Transform>())
    {
        var childObj = CopyObject(child.gameObject);
        if (childObj != null)
        {
            childObj.transform.SetParent(createObject.transform, false);
        }
    }
    return createObject;
}

/// <summary>
/// 元オブジェクトをコピーしてrecttransformにして生成
/// </summary>
/// <param name="targetObjct"></param>
/// <returns></returns>
private static GameObject CreateCopyGameObject(GameObject targetObjct)
{
    if (targetObjct.activeInHierarchy == false)
    {
        return null;
    }
    GameObject copyObject = new GameObject(targetObjct.name);
    RectTransform copyTransform = copyObject.AddComponent<RectTransform>();
    Transform targetTransform = targetObjct.transform;
    SpriteRenderer targetSpriteRenderer = targetObjct.GetComponent<SpriteRenderer>();
    var targetPos = targetTransform.localPosition;

    copyTransform.localScale = Vector2.one;
    copyTransform.localPosition = new Vector2(targetPos.x, targetPos.y);
    copyTransform.localRotation = targetTransform.localRotation;
    AddImageSprite(targetSpriteRenderer, copyObject);
    return copyObject;
}

/// <summary>
/// SpriteRendererをImageに変換
/// </summary>
/// <param name="target"></param>
/// <param name="copy"></param>
private static void AddImageSprite(SpriteRenderer target, GameObject copy)
{
    if (target != null)
    {
        var image = copy.AddComponent<UnityEngine.UI.Image>();
        image.sprite = target.sprite;
        //image.SetNativeSize();
    }
}

}

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0