2016年10月28日 星期五

Unity 編輯視窗方割Sprite

小弟我之前跟夥伴一起做過遊戲,因為我負責程式部分,主要原因我程式控制Sprite組件為主,導致要去進行所謂的分割,但是發現到另外夥伴對於美術所繪製的人物位置太過於隨意,導致成是這邊最後還要去進行最後調整,浪費了許多時間。

因此就想要試做,如何可以分割Sprite 裡面的小圖片,所寫的程式,小弟程式功力不是很好希望各位大大,有更好的方式,也歡迎提供。

--------------
Script(c#):

using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Collections.Generic;

public class SpriteProcessor : EditorWindow
{

    private Vector2 vector2Label;          // 標籤位置(BeginScrollView 用的)
    private GUIStyle style = new GUIStyle();   // GUI 風格
    private string spriteSegmentationType = "";  // Sprite 分割像素
    private string spriteName = "";        // Sprite 分格後名稱
    private int spriteTitleNumber = 0;   // 分格後的名稱編號
    private int spriteSegmentationNumber;   // 分割數值字串轉型


    /// 
    ///  呼叫視窗
    /// 
    [MenuItem("測試/Sprite寫法")]
    public static void spriteWindowSetting()
    {
        SpriteProcessor windows = EditorWindow.GetWindow(typeof(SpriteProcessor), true, "Sprite 自動分割") as SpriteProcessor;
        windows.Show();
    }

    /// 
    /// 選擇貼圖(Sprite)
    /// 
    /// 
    static Object[] getSelectTexture()
    {
        return Selection.GetFiltered(typeof(Texture2D), SelectionMode.DeepAssets);
    }

    void OnGUI()
    {

        style.fontSize = 18;
        style.normal.textColor = Color.white;

        GUI.Label(new Rect(0, 0, 100, 30), "圖片分割", style);

        // Sprite 分割像素
        GUILayout.BeginArea(new Rect(0, 30, 300, 100));
        GUILayout.BeginHorizontal();
        GUILayout.Label("Sprite 分割像素");
        GUILayout.EndHorizontal();
        GUILayout.EndArea();

        // Sprite 分割像素輸入
        GUILayout.BeginArea(new Rect(150, 30, 150, 100));
        GUILayout.BeginHorizontal();
        spriteSegmentationType = GUILayout.TextField(spriteSegmentationType);
        GUILayout.EndHorizontal();
        GUILayout.EndArea();

        // Sprite標籤
        GUILayout.BeginArea(new Rect(0, 110, 300, 100));
        GUILayout.BeginHorizontal();
        GUILayout.Label("Sprite 標簽名稱");
        GUILayout.EndArea();
        GUILayout.EndHorizontal();

        // Sprite標籤輸入
        GUILayout.BeginArea(new Rect(148, 110, 150, 100));
        GUILayout.BeginHorizontal();
        spriteName = GUILayout.TextField(spriteName);
        GUILayout.EndHorizontal();
        GUILayout.EndArea();

        GUILayout.BeginArea(new Rect(200, 150, 100, 100));
        GUILayout.BeginHorizontal();
        if (GUILayout.Button("確定"))
            SetPivots();
        GUILayout.EndHorizontal();
        GUILayout.EndArea();
    }

    /// 
    /// 分割動作
    /// 
    void SetPivots()
    {
        spriteTitleNumber = 0;
        // 判斷轉型成功執行分割
        if (int.TryParse(spriteSegmentationType, out spriteSegmentationNumber))
        {
            Object[] textures = getSelectTexture();
            Selection.objects = new Object[0];

            SpriteMetaData d = new SpriteMetaData();
            
            foreach (Texture2D texture in textures)
            {
                string path = AssetDatabase.GetAssetPath(texture);
                TextureImporter ti = AssetImporter.GetAtPath(path) as TextureImporter;
                ti.isReadable = true;
                List<SpriteMetaData> newData = new List<SpriteMetaData>();
                newData.Remove(d);
                for (int x = 0; x < texture.width; x += spriteSegmentationNumber)
                {
                    for (int y = 0; y < texture.height; y += spriteSegmentationNumber)
                    {
                        d.alignment = 9;
                        d.pivot = new Vector2(0.5f, 0.5f);
                        d.name = spriteName + "_" + (spriteTitleNumber += 1);
                        d.rect = new Rect(x, y, spriteSegmentationNumber, spriteSegmentationNumber);
                        newData.Add(d);
                    }
                }
                ti.spritesheet = newData.ToArray();
                AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate);
            }
        }
    }
}

------------
 結果圖:

2016年10月3日 星期一

Blender 匯入fbx錯誤...解決方法

Blender 如果匯入fbx 錯誤,會出現這個訊息: Version 6100 unsupported, must be 7100 or later







爬文之後,證明是fbx SDK的問題,小弟這邊解決方法是去下載 Autodesk FBX Converter.之後就可以解決此問題。

有人提供 : fbx sdk 下載地點(AutoDesk) : FBX SDK     感謝 Deathicon 大大提供

點 Add FBX Converter → Add 所需fbx檔案

軟體會重新匯入新的fbx→再由Blender 匯入即可。