2016年9月23日 星期五

Unity 模型觀看別的物件

Unity 官方程式API 也是同樣功能 LookAt (在transform.LookAt(gameobjcet.transform));
------------------

Script(c#):
public class PlasmaData : MonoBehaviour {

    // 物件觀看
    public void lookAtObjcet(GameObject lookOjcet, GameObject meOjcet) {

        Vector3 vec = meOjcet.transform.position - lookOjcet.transform.position;
        Quaternion rota = Quaternion.LookRotation(new Vector3(-vec.x, -vec.y, -vec.z));
        float angle = Quaternion.Angle(rota, Quaternion.identity);

        meOjcet.transform.rotation = Quaternion.Lerp(meOjcet.transform.rotation, rota, 0.2f);
         
     
    }
}

------------------

更新程式碼 ( 功能含 射程範圍、限制物件旋轉角度)

Script(c#):

using UnityEngine;
using System.Collections;

public class CannonData : MonoBehaviour {

    // 我方觀看物件
    private GameObject lookOjcetType;
    public GameObject lookObjcet {
        get { return lookOjcetType; }
        set { lookOjcetType = value; }
    }

    // 我方自己物件
    private GameObject meOjcetType;
    public GameObject meOjcet {
        get { return meOjcetType; }
        set { meOjcetType = value; }
    }

    // 我方選轉角度
    private float rotationAngleTpye;
    public float rotationAngle {
        get { return rotationAngleTpye; }
        set { rotationAngleTpye = value; }
    }

    // 我方射程範圍
    private float rangeType;
    public float range {
        get { return rangeType; }
        set { rangeType = value; }
    }

    // 選擇正與反向
    private int modeType;
    public int mode {
        get { return modeType; }
        set { modeType = value; }
    }

     public void LookAtFouction() {

        switch (modeType) {

            case 1:

                if (Vector3.Distance(lookOjcetType.transform.position, meOjcetType.transform.position) < rangeType) {                 
                    // 計算向量,目標座標 - 自己自身座標
                    Vector3 vec = lookOjcetType.transform.position - meOjcetType.transform.position;
                    // 降量轉為四元素即旋轉值
                    Quaternion rota = Quaternion.LookRotation(new Vector3(-vec.x, -vec.y, -vec.z));
                    // 計算rota與自身旋轉角度的夾角,在此砲台的默認選轉設為 Quaternion.identity
                    float angle = Quaternion.Angle(rota, Quaternion.identity);

                    if (angle > rotationAngleTpye * 0.5f)
                    {
                        meOjcetType.transform.rotation = Quaternion.Lerp(meOjcetType.transform.rotation, rota, 0.2f);
                        Debug.DrawLine(meOjcetType.transform.position, lookOjcetType.transform.position, Color.red);
                    }
                }
                
                break;

           case 2:

                if (Vector3.Distance(lookOjcetType.transform.position, meOjcetType.transform.position) < rangeType)
                {
                    Vector3 vec2 = lookOjcetType.transform.position - meOjcetType.transform.position;
                    Quaternion rota2 = Quaternion.LookRotation(vec2);
                    float angle2 = Quaternion.Angle(rota2, Quaternion.identity);

                    if (angle2 > rotationAngleTpye * 0.5f)
                    {
                        meOjcetType.transform.rotation = Quaternion.Lerp(meOjcetType.transform.rotation, rota2, 0.2f);
                        Debug.DrawLine(meOjcetType.transform.position, lookOjcetType.transform.position, Color.red);
                    }
                }
                break;
        }
    }

}

-----------------------

使用方式-說明:

利用物件裡面的程式加入Component記得在Awake方法呼叫,如果使用Update 方式呼叫很吃效能,也可以寫在Start裡面呼叫,但是小弟並不建議就是了。

Script(c#) :

using UnityEngine;
using System.Collections;

public class PlasmaFunction : PlasmaData{

    public GameObject[] door, charged;
    public float x = 327, speed = 5;
    public GameObject enemy, barrel;  // 敵人, 自己

    public float rotationAngle;  // 大砲選轉角度
    public float range;         // 射程
    public int mode;            // 大砲選轉模式

    CannonData cannon;

    void Awake() {

        cannon = gameObject.AddComponent<CannonData>();
        cannon.lookObjcet = enemy;
        cannon.meOjcet = barrel;
        cannon.rotationAngle = rotationAngle;
        cannon.range = range;
        cannon.mode = mode;
    }


    void Update(){

        cannon.LookAtFouction();
    }
}

2016年9月6日 星期二

Unity在Asset 路徑取得貼圖在設定腳本

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

public class SpriteFunction : EditorWindow{

    static void Init() {
        SpriteFunction winodws = (SpriteFunction)EditorWindow.GetWindow(typeof(SpriteFunction),true, "sprite 方法");
        winodws.Show();
    }


    TextureImporter getTextureSetting(string path) {
        TextureImporter importes = AssetImporter.GetAtPath(path) as TextureImporter;
        // 貼圖設定功能
        return importes;
    }

    void loopSetTexture() {

        Object[] textures = getSelectTexture2D();
        Selection.objects = new Object[0];

        foreach (Texture2D texture in textures) {
            string path = AssetDatabase.GetAssetPath(texture);
            TextureImporter texImporter = getTextureSetting(path);
            TextureImporterSettings tis = new TextureImporterSettings();
            texImporter.ReadTextureSettings(tis);
            texImporter.SetTextureSettings(tis);
            AssetDatabase.ImportAsset(path);

        }
    }

    /// <summary>
    /// 選取貼圖
    /// </summary>
    /// <returns></returns>
    Object[] getSelectTexture2D() {
        return Selection.GetFiltered(typeof(Texture2D), SelectionMode.DeepAssets);
    }
}

2016年9月3日 星期六

Unity3D 圖片資源匯入設置

Script (c#):

using UnityEngine;
using System.Collections;
using UnityEditor;
/// <summary>
/// 批量图片资源导入设置
/// 使用说明: 选择需要批量设置的贴图,
/// 单击DuanMenu/Texture Import Settings,
/// 打开窗口后选择对应参数,
/// 点击Set Texture ImportSettings,
/// 稍等片刻,--批量设置成功。
/// </summary>


public class TextureImportSetting : EditorWindow
{

    /// <summary>
    /// 临时存储int[]
    /// </summary>
    private int[] IntArray = new int[] { 0, 1, 2, 3, 4, 5, 6, 7 };
    //AnisoLevel
    private int AnisoLevel = 1;
    //Filter Mode
    private int FilterModeInt = 0;
    private string[] FilterModeString = new string[] { "Point", "Bilinear", "Trilinear" };
    //Wrap Mode
    private int WrapModeInt = 0;
    private string[] WrapModeString = new string[] { "Repeat", "Clamp" };
    //Texture Type
    private int TextureTypeInt = 0;
    private string[] TextureTypeString = new string[] { "Texture", "Normal Map", "GUI", "Refelection", "Cookie", "Lightmap", "Advanced" };
    //Max Size
    private int MaxSizeInt = 5;
    private string[] MaxSizeString = new string[] { "32", "64", "128", "256", "512", "1024", "2048", "4096" };
    //Format
    private int FormatInt = 0;
    private string[] FormatString = new string[] { "Compressed", "16 bits", "true color" };

    /// <summary>
    /// 创建、显示窗体
    /// </summary>
    [@MenuItem("DuanMenu/Texture Import Settings")]
    private static void Init()
    {
        TextureImportSetting window = (TextureImportSetting)EditorWindow.GetWindow(typeof(TextureImportSetting), true, "TextureImportSetting");
        window.Show();
    }

    /// <summary>
    /// 显示窗体里面的内容
    /// </summary>
    private void OnGUI()
    {
        //AnisoLevel
        GUILayout.BeginHorizontal();
        GUILayout.Label("Aniso Level  ");
        AnisoLevel = EditorGUILayout.IntSlider(AnisoLevel, 0, 9);
        GUILayout.EndHorizontal();
        //Filter Mode
        FilterModeInt = EditorGUILayout.IntPopup("Filter Mode", FilterModeInt, FilterModeString, IntArray);
        //Wrap Mode
        WrapModeInt = EditorGUILayout.IntPopup("Wrap Mode", WrapModeInt, WrapModeString, IntArray);
        //Texture Type
        TextureTypeInt = EditorGUILayout.IntPopup("Texture Type", TextureTypeInt, TextureTypeString, IntArray);
        //Max Size
        MaxSizeInt = EditorGUILayout.IntPopup("Max Size", MaxSizeInt, MaxSizeString, IntArray);
        //Format
        FormatInt = EditorGUILayout.IntPopup("Format", FormatInt, FormatString, IntArray);
        if (GUILayout.Button("Set Texture ImportSettings"))
            LoopSetTexture();
    }

    /// <summary>
    /// 获取贴图设置
    /// </summary>
    public TextureImporter GetTextureSettings(string path)
    {
        TextureImporter textureImporter = AssetImporter.GetAtPath(path) as TextureImporter;
        //AnisoLevel
        textureImporter.anisoLevel = AnisoLevel;
        //Filter Mode
        switch (FilterModeInt)
        {
            case 0:
                textureImporter.filterMode = FilterMode.Point;
                break;
            case 1:
                textureImporter.filterMode = FilterMode.Bilinear;
                break;
            case 2:
                textureImporter.filterMode = FilterMode.Trilinear;
                break;
        }
        //Wrap Mode
        switch (WrapModeInt)
        {
            case 0:
                textureImporter.wrapMode = TextureWrapMode.Repeat;
                break;
            case 1:
                textureImporter.wrapMode = TextureWrapMode.Clamp;
                break;
        }
        //Texture Type
        switch (TextureTypeInt)
        {
            case 0:
                textureImporter.textureType = TextureImporterType.Image;
                break;
            case 1:
                textureImporter.textureType = TextureImporterType.Bump;
                break;
            case 2:
                textureImporter.textureType = TextureImporterType.GUI;
                break;
            case 3:
                textureImporter.textureType = TextureImporterType.Reflection;
                break;
            case 4:
                textureImporter.textureType = TextureImporterType.Cookie;
                break;
            case 5:
                textureImporter.textureType = TextureImporterType.Lightmap;
                break;
            case 6:
                textureImporter.textureType = TextureImporterType.Advanced;
                break;
        }
        //Max Size 
        switch (MaxSizeInt)
        {
            case 0:
                textureImporter.maxTextureSize = 32;
                break;
            case 1:
                textureImporter.maxTextureSize = 64;
                break;
            case 2:
                textureImporter.maxTextureSize = 128;
                break;
            case 3:
                textureImporter.maxTextureSize = 256;
                break;
            case 4:
                textureImporter.maxTextureSize = 512;
                break;
            case 5:
                textureImporter.maxTextureSize = 1024;
                break;
            case 6:
                textureImporter.maxTextureSize = 2048;
                break;
            case 7:
                textureImporter.maxTextureSize = 4096;
                break;
        }
        //Format
        switch (FormatInt)
        {
            case 0:
                textureImporter.textureFormat = TextureImporterFormat.AutomaticCompressed;
                break;
            case 1:
                textureImporter.textureFormat = TextureImporterFormat.Automatic16bit;
                break;
            case 2:
                textureImporter.textureFormat = TextureImporterFormat.AutomaticTruecolor;
                break;
        }
        return textureImporter;
    }

    /// <summary>
    /// 循环设置选择的贴图
    /// </summary>
    private void LoopSetTexture()
    {
        Object[] textures = GetSelectedTextures();
        Selection.objects = new Object[0];
        foreach (Texture2D texture in textures)
        {
            string path = AssetDatabase.GetAssetPath(texture);
            TextureImporter texImporter = GetTextureSettings(path);
            TextureImporterSettings tis = new TextureImporterSettings();
            texImporter.ReadTextureSettings(tis);
            texImporter.SetTextureSettings(tis);
            AssetDatabase.ImportAsset(path);
        }
    }

    /// <summary>
    /// 获取选择的贴图
    /// </summary>
    /// <returns></returns>
    private Object[] GetSelectedTextures()
    {
        return Selection.GetFiltered(typeof(Texture2D), SelectionMode.DeepAssets);
    }
}

--------------

資料來源: http://www.cnblogs.com/fortomorrow/archive/2012/11/05/unity11.html

-------------------

更改後版本... 

但是 Unity Editor 還是有很多不足的地方,如: 由 Editor Windows 開啟 Sprite Editor 可能就沒有辦法囉,因為目前小弟暫時找不到方法可以解決。

Script(C#):

using UnityEngine;
using System.Collections;
using UnityEditor;

public class ImportSetting : EditorWindow{

    private int[] intArray = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    private int anisoLevel = 1;

    private int filterModeInt = 0;
    private string[] filterModeString = new string[] { "Point", "Bilinear", "Trilinear" };

    private int wrapModeInt = 0;
    private string[] warpModeSering = new string[] { "Repeat", "Clamp" };

    private int textrueTypeInt = 0;
    private string[] textrueTypeSetting = new string[] { "Textrue", "Normal Map", "GUI", "Refelection", "Cookie", "Lightmap", "Sprite", "Advanced" };

    private int maxSizeInt = 0;
    private string[] maxSizeString = new string[] { "32", "64", "128", "256", "512", "1024", "2048", "4096" };

    private int formatInt = 0;
    private string[] formatString = new string[] { "Compressed", "16 bits", "true color" };

    // Texture 和 Cookie
    private bool alphaFromGraycal = false, alphaIsTransparen = false;

    // Sprite
    private int spriteModeInt = 0;
    private string[] spriteModeString = new string[] { "Single", "Multiple" };
    private string packingTag = "";
    private float pixelsPerUnit = 0;

    GUIStyle style = new GUIStyle();

    [MenuItem("遊戲控制器視窗/匯入素材設定視窗")]
    static void Init() {
        ImportSetting windows = (ImportSetting)EditorWindow.GetWindow(typeof(ImportSetting), true, "素材控制視窗");
        windows.Show();
    }

    void OnGUI() {

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

        // Texture Type;
        GUILayout.BeginArea(new Rect(0, 0, 300, 100));
        GUILayout.BeginHorizontal();
        textrueTypeInt = EditorGUILayout.IntPopup("Texture Type(紋理屬性)", textrueTypeInt, textrueTypeSetting, intArray);
        GUILayout.EndHorizontal();
        GUILayout.EndArea();

        GUILayout.BeginArea(new Rect(0, 30, 300, 30));
        GUILayout.BeginHorizontal();
        GUILayout.Label("紋理基本設定設定", style);
        GUILayout.EndHorizontal();
        GUILayout.EndArea();

        // Filter Mode
        GUILayout.BeginArea(new Rect(0, 60, 300, 100));
        GUILayout.BeginHorizontal();
        filterModeInt = EditorGUILayout.IntPopup("Filter Mode(過濾模式)", filterModeInt, filterModeString, intArray);
        GUILayout.EndHorizontal();
        GUILayout.EndArea();

        // Warp Mode
        GUILayout.BeginArea(new Rect(0, 90, 300, 100));
        GUILayout.BeginHorizontal();
        wrapModeInt = EditorGUILayout.IntPopup("Wrap Mode(換行模式)", wrapModeInt, warpModeSering, intArray);
        GUILayout.EndHorizontal();
        GUILayout.EndArea();

        //Max Size
        GUILayout.BeginArea(new Rect(0, 120, 300, 100));
        GUILayout.BeginHorizontal();
        maxSizeInt = EditorGUILayout.IntPopup("Max Size(最大纹理大小)", maxSizeInt, maxSizeString, intArray);
        GUILayout.EndHorizontal();
        GUILayout.EndArea();

        // Format
        GUILayout.BeginArea(new Rect(0, 150, 300, 100));
        GUILayout.BeginHorizontal();
        formatInt = EditorGUILayout.IntPopup("Max Size(紋理格式)", formatInt, formatString, intArray);
        GUILayout.EndHorizontal();
        GUILayout.EndArea();

        // AnisoLevel
        GUILayout.BeginArea(new Rect(0, 180, 300, 100));
        GUILayout.BeginHorizontal();
        GUILayout.Label("AnisoLevel(紋理的過濾等級)");
        anisoLevel = EditorGUILayout.IntSlider(anisoLevel, 0, 9);
        GUILayout.EndHorizontal();
        GUILayout.EndArea();

        // 確定
        GUILayout.BeginArea(new Rect(200, 300, 100, 100));
        GUILayout.BeginHorizontal();
        if (GUILayout.Button("確定"))
            loopSetTexture();
        GUILayout.EndHorizontal();
        GUILayout.EndArea();

        switch (textrueTypeInt) {
  
            case 0:
                
                GUILayout.BeginArea(new Rect(0, 210, 300, 100));
                GUILayout.BeginHorizontal();
                GUILayout.Label("Alpha From Graycal(阿爾法從灰度)");
                alphaFromGraycal = EditorGUILayout.Toggle(alphaFromGraycal);
                GUILayout.EndHorizontal();
                GUILayout.EndArea();

                GUILayout.BeginArea(new Rect(0, 240, 300, 100));
                GUILayout.BeginHorizontal();
                GUILayout.Label("Alpha Is Transparen(阿爾法是透明的)");
                alphaIsTransparen = EditorGUILayout.Toggle(alphaIsTransparen);
                GUILayout.EndHorizontal();
                GUILayout.EndArea();

                break;

            case 4:

                GUILayout.BeginArea(new Rect(0, 210, 300, 100));
                GUILayout.BeginHorizontal();
                GUILayout.Label("Alpha From Graycal(阿爾法從灰度)");
                alphaFromGraycal = EditorGUILayout.Toggle(alphaFromGraycal);
                GUILayout.EndHorizontal();
                GUILayout.EndArea();

                break;

            case 6:

                GUILayout.BeginArea(new Rect(0, 210, 300, 100));
                GUILayout.BeginHorizontal();
                spriteModeInt = EditorGUILayout.IntPopup("Sprite Mode(Sprite 模式)", spriteModeInt, spriteModeString, intArray);
                GUILayout.EndHorizontal();
                GUILayout.EndArea();

                GUILayout.BeginArea(new Rect(0, 240, 300, 100));
                GUILayout.BeginHorizontal();
                GUILayout.Label("Sprite 標籤");
                packingTag = EditorGUILayout.TextArea(packingTag);
                GUILayout.EndHorizontal();
                GUILayout.EndArea();

                GUILayout.BeginArea(new Rect(0, 270, 300, 100));
                GUILayout.BeginHorizontal();
                GUILayout.Label("Pixels Per Unit(每單位像素)");
                pixelsPerUnit = EditorGUILayout.Slider((float)pixelsPerUnit, 0, 100);
                GUILayout.EndHorizontal();
                GUILayout.EndArea();

                break;
        }
    }

    TextureImporter getTextureSettings(string path) {

        TextureImporter textureImporter = AssetImporter.GetAtPath(path) as TextureImporter;
        textureImporter.anisoLevel = anisoLevel;

        // textureType (貼圖類型)
        switch (textrueTypeInt){

            case 0:
                textureImporter.textureType = TextureImporterType.Image;
                break;
            case 1:
                textureImporter.textureType = TextureImporterType.Bump;
                break;
            case 2:
                textureImporter.textureType = TextureImporterType.GUI;
                break;
            case 3:
                textureImporter.textureType = TextureImporterType.Reflection;
                break;
            case 4:
                textureImporter.textureType = TextureImporterType.Cookie;
                break;
            case 5:
                textureImporter.textureType = TextureImporterType.Lightmap;
                break;
            case 6:
                textureImporter.textureType = TextureImporterType.Sprite;
                break;
            case 7:
                textureImporter.textureType = TextureImporterType.Advanced;
                break;
                
        }

        // Filter (過濾)
        switch (filterModeInt) {
            case 0:
                textureImporter.filterMode = FilterMode.Point;
                break;
            case 1:
                textureImporter.filterMode = FilterMode.Bilinear;
                break;
            case 2:
                textureImporter.filterMode = FilterMode.Trilinear;
                break;
        }

        // Warp (換行)
        switch (wrapModeInt) {
            case 0:
                textureImporter.wrapMode = TextureWrapMode.Repeat;
                break;
            case 1:
                textureImporter.wrapMode = TextureWrapMode.Clamp;
                break;
        }

        // Max (紋理最大的大小)
        switch (maxSizeInt) {
            case 0:
                textureImporter.maxTextureSize = 32;
                break;
            case 1:
                textureImporter.maxTextureSize = 64;
                break;
            case 2:
                textureImporter.maxTextureSize = 128;
                break;
            case 3:
                textureImporter.maxTextureSize = 256;
                break;
            case 4:
                textureImporter.maxTextureSize = 512;
                break;
            case 5:
                textureImporter.maxTextureSize = 1024;
                break;
            case 6:
                textureImporter.maxTextureSize = 2048;
                break;
            case 7:
                textureImporter.maxTextureSize = 4096;
                break;
        }

        // Format (格式)
        switch (formatInt) {
            case 0:
                textureImporter.textureFormat = TextureImporterFormat.AutomaticCompressed;
                break;
            case 1:
                textureImporter.textureFormat = TextureImporterFormat.Automatic16bit;
                break;
            case 2:
                textureImporter.textureFormat = TextureImporterFormat.AutomaticTruecolor;
                break;
        }

        // TextureType Setting
        switch (textrueTypeInt) {
            case 0:
                textureImporter.alphaIsTransparency = alphaIsTransparen;
                textureImporter.grayscaleToAlpha = alphaFromGraycal;
                break;
            case 4:
                textureImporter.grayscaleToAlpha = alphaFromGraycal;
                break;
            case 6:

                if (spriteModeInt.Equals(0))
                    textureImporter.spriteImportMode = SpriteImportMode.Single;
                else if (spriteModeInt.Equals(1))
                    textureImporter.spriteImportMode = SpriteImportMode.Multiple;

                textureImporter.spritePackingTag = packingTag;
                textureImporter.spritePixelsPerUnit = pixelsPerUnit;

                break;
        }

        return textureImporter;
    }

    /// <summary>
    /// 設置選擇貼圖
    /// </summary>
    void loopSetTexture() {

        Object[] textures = getSelectedTextures();
        Selection.objects = new Object[0];

        foreach (Texture2D texture in textures) {
            string path = AssetDatabase.GetAssetPath(texture);
            TextureImporter texImporter = getTextureSettings(path);
            TextureImporterSettings tis = new TextureImporterSettings();
            texImporter.ReadTextureSettings(tis);
            texImporter.SetTextureSettings(tis);
            AssetDatabase.ImportAsset(path);
        }
    }

    /// <summary>
    /// 選取貼圖
    /// </summary>
    /// <returns></returns>
    Object[] getSelectedTextures() {
        return Selection.GetFiltered(typeof(Texture2D), SelectionMode.DeepAssets);
    }

}

---------------------

結果圖:



2016年9月1日 星期四

Unity EditorGUILayout 製作圖片匯入實例



Script(C#):

using UnityEngine;
using System.Collections;
using UnityEditor;

public class Material : EditorWindow{

    GUIStyle style = new GUIStyle();
    SystemWindowsForm windowsForm = new SystemWindowsForm();
    Vector2 scrollPositionBackGround;

    [MenuItem("遊戲控制器視窗/2D/素材")]
    static void materialWindowFunction() {
        Material materialWindow = new Material();
        materialWindow = (Material)EditorWindow.GetWindow(typeof(Material));
        materialWindow.Show();
    }

    void OnGUI() {
        
        // GUI 風格
        style.fontSize = 18;
        style.normal.textColor = Color.white;

        // GUILayout 自訂位置
        GUILayout.BeginArea(new Rect(0, 0, 170, 30));
        GUILayout.Label("圖片", style);
        GUILayout.EndArea();

        GUILayout.BeginArea(new Rect(0, 30, 170, 30));
        GUILayout.Label("圖片路徑位置:", style);
        GUILayout.EndArea();

        // 背景圖片的路徑名稱
        GUILayout.BeginArea(new Rect(0, 60, 200, 60));
        scrollPositionBackGround = GUILayout.BeginScrollView(scrollPositionBackGround, GUILayout.Width(200),GUILayout.Height(60));
        GUILayout.Box(windowsForm.pathTpye, style);
        GUILayout.EndScrollView();
        GUILayout.EndArea();

        // 背景圖片讀取事件
        EditorGUILayout.BeginHorizontal();
        if (GUI.Button(new Rect(0, 130, 170, 30), GUIContent.none))
            windowsForm.openFile();
        
        GUILayout.BeginArea(new Rect(0, 130, 170, 30));
        GUILayout.Label("背景圖片匯入", style);
        GUILayout.EndArea();
        EditorGUILayout.EndHorizontal();

        // 背景圖片匯入事件
        EditorGUILayout.BeginHorizontal();
        if (GUI.Button(new Rect(180, 130, 50, 30), GUIContent.none))
        {
            if (windowsForm.pathTpye.Equals("No Image"))
                windowsForm.messag("讀不到路徑");
            else {
                windowsForm.CodyImage();
            }
        }
            
        GUILayout.BeginArea(new Rect(180, 130, 50, 30));
        GUILayout.Label("確定", style);
        GUILayout.EndArea();
        EditorGUILayout.EndHorizontal();
    }
}

-------------------------

Script (C#):

using System.Collections;
using System.Windows.Forms;
using System.IO;
using System.Drawing;
using UnityEngine;

public class SystemWindowsForm{

    OpenFileDialog openFileDialog = new OpenFileDialog();

    // 檔案路徑
    private string path = "No Image";
    public string pathTpye {
        get { return path; }
    }

    private string fileName;

    /// <summary>
    /// messageBox 訊息列
    /// </summary>
    /// <param string="訊息"></param>
    public void messag(string message) {
        MessageBox.Show(message);
    }

    /// <summary>
    /// 開啟檔案
    /// </summary>
    public void openFile() {

        openFileDialog.Title = "開啟檔案";
        openFileDialog.Filter = "PNG Image|*.png|JPG Image|*.jpg";
        openFileDialog.ShowDialog();

        switch (openFileDialog.FilterIndex) {
            case 1:
                if (File.Exists(openFileDialog.FileName))
                    path = openFileDialog.FileName;
                    fileName = openFileDialog.SafeFileName;
                break;

            case 2:
                if (File.Exists(openFileDialog.FileName))
                    path = openFileDialog.FileName;
                    fileName = openFileDialog.SafeFileName;
                break;
                
        }
    }

    public void CodyImage() {

        string localPaht = UnityEngine.Application.dataPath + "/GameController/Textrue2D/Background/";
        Bitmap image = new Bitmap(path);

        // 翻轉
        image.RotateFlip(RotateFlipType.Rotate180FlipX); 

        Texture2D readImage = new Texture2D(image.Width, image.Height);

        for (int x = 0; x < image.Width; x++) {
            for (int y = 0; y < image.Height; y++) {
                readImage.SetPixel(x, y, new Color32(image.GetPixel(x, y).R,
                    image.GetPixel(x,y).G,
                    image.GetPixel(x,y).B,
                    image.GetPixel(x,y).A));
            }
        }

        readImage.Apply();
        byte[] imageDate = readImage.EncodeToPNG();
        File.WriteAllBytes(localPaht + fileName, imageDate);

        messag("匯入完成");
    }
}

------------------

結果圖: