2017年5月27日 星期六

Inspector Value List

Script(C#):

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

public class Biochemical_Multitude : ObjectClass
{
    // 物件模式
    public enum SelectObj
    {
        roteObj,
        moveObj,
    }
    public SelectObj objsType;

    // 物件行為方向
    public enum Direction
    {
        forward,
        up,
        down,
        left,
        right,
    }
    public Direction selectDrection;

    public List roteObjs = new List();
    public float roteSpeed;
    public List moveObjs = new List();
    public float moveSpeed;

    void Update()
    {
        switch (objsType)
        {
            case SelectObj.moveObj:
                foreach (Transform tra in moveObjs)
                    Move(tra, driectionFunction(selectDrection), moveSpeed);

                break;

            case SelectObj.roteObj:

                foreach (Transform tra in roteObjs)
                    Rote(tra, driectionFunction(selectDrection), roteSpeed);
                break;
        }
    }

    /// 
    /// 方向
    /// 
    /// 
    /// 
    Vector3 driectionFunction(Direction direction)
    {
        Vector3 vector3 = Vector3.zero;

        switch (direction)
        {
            case Direction.forward:
                vector3 = Vector3.forward;
                break;
            case Direction.up:
                vector3 = Vector3.up;
                break;
            case Direction.down:
                vector3 = Vector3.down;
                break;
            case Direction.left:
                vector3 = Vector3.left;
                break;
            case Direction.right:
                vector3 = Vector3.right;
                break;
        }
        return vector3;
    }
}

----------------------------
Editor Script Script(C#):

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

[CustomEditor(typeof(Biochemical_Multitude))]
public class Biochemical_MultitudeEditor : Editor {
    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        var script = target as Biochemical_Multitude;
        SerializedProperty tps = serializedObject.FindProperty("roteObjs");  // 路徑
        EditorGUI.BeginChangeCheck();
        EditorGUILayout.PropertyField(tps, new GUIContent("roteObjs"), true);
        if (EditorGUI.EndChangeCheck())
            serializedObject.ApplyModifiedProperties();
     }
}

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


2017年4月29日 星期六

隱藏 Inspector 腳本數值

-------物件腳本屬性 C#-------

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

public class Biochemical_Single : ObjectClass {

    // 物件模式
    public enum SelectObj
    {
        roteObj,
        moveObj,
    }
    public SelectObj objsType;

    // 物件行為方向
    public enum Direction
    {
        forward,
        up,
        down,
        left,
        right,
    }
    public Direction direction;

    public Transform tramsform;

    public float moveSpeed, roteSpeed; // 物件行為速度
  
    // Update is called once per frame
    void Update () {

        switch (objsType)
        {
            case SelectObj.moveObj:
                
                    Move(tramsform, driectionFunction(direction), moveSpeed);

                break;

            case SelectObj.roteObj:

                
                    Rote(tramsform, driectionFunction(direction), roteSpeed);
                break;
        }
    }

    /// 
    /// 方向
    /// 
    /// 
    /// 
    Vector3 driectionFunction(Direction direction)
    {
        Vector3 vector3 = Vector3.zero;

        switch (direction)
        {
            case Direction.forward:
                vector3 = Vector3.forward;
                break;
            case Direction.up:
                vector3 = Vector3.up;
                break;
            case Direction.down:
                vector3 = Vector3.down;
                break;
            case Direction.left:
                vector3 = Vector3.left;
                break;
            case Direction.right:
                vector3 = Vector3.right;
                break;
        }
        return vector3;
    }
}

---更改Inspector 腳本GUI顯示(C#)--------


using UnityEngine;
using UnityEditor;
using System;

[CustomEditor(typeof(Biochemical_Single))]  // 更改 Inspector 腳本
public class MyScriptEditor : Editor {

    override public void OnInspectorGUI()
    {
        var script = target as Biochemical_Single;

        script.objsType = (Biochemical_Single.SelectObj)EditorGUILayout.EnumPopup("select Obj", script.objsType);
        script.direction = (Biochemical_Single.Direction)EditorGUILayout.EnumPopup("direction", script.direction);
        script.tramsform = EditorGUILayout.ObjectField(script.tramsform ,typeof(Transform), true) as Transform;

        if (script.objsType == Biochemical_Single.SelectObj.roteObj)
        {
            EditorGUI.indentLevel++;
            EditorGUILayout.PrefixLabel("roteSpeed");
            script.roteSpeed = EditorGUILayout.Slider(script.roteSpeed, script.roteSpeed, 999);
            EditorGUI.indentLevel--;
        }
    }
}
--------執行結果---------
 Select Obj 選擇項目 : Rote Obj














 Select Obj 選擇項目 : Move Obj

2016年12月28日 星期三

Unity 讀取文字檔內文

VariousVocabularyCreateText(C#):

using System.Collections.Generic;
using UnityEngine;
using System.Collections;
using Newtonsoft.Json;
using System.IO;
using System.Text;

namespace VariousVocabularyCreateText
{

    public class VocabularyData
    {
        // 檔案路徑
        private string folderPath = "D:/Vocabulary/";
        private string folderPathType
        {
            get { return folderPath; }
        }

        // 檔案名稱
        private string vocabularName;
        public string vocabularNameType
        {
            get { return vocabularName; }
            set { vocabularName = value; }
        }

        // 讀取文字檔內文
        private string readtxtMessage;
        public string readtxtMessageType
        {
            get { return readtxtMessage; }
        }

        // 附檔名
        private string attachment = ".txt";

        // 文字內容
        private List readTxtMessageList = new List();

        /// 
        /// 檢查資料夾
        /// 
        /// 
        private bool examinationFolderFunction()
        {

            bool fileExisit = (File.Exists(folderPath)) ? true : false;
            return fileExisit;
        }

        /// 
        /// 檢查文字檔
        /// 
        /// 
        private bool exmainationTxtFunction()
        {

            bool txtFileExisit = (File.Exists(folderPath + vocabularName + attachment)) ? true : false;
            return txtFileExisit;
        }

        /// 
        /// 建立文件檔
        /// 
        public void createTxtMeesage()
        {

            if (!examinationFolderFunction())
            {
                Directory.CreateDirectory(folderPath);

                FileStream fileStream = new FileStream(folderPath + vocabularName + attachment, FileMode.OpenOrCreate);
                StreamWriter stramWrite = new StreamWriter(fileStream);

                try
                {
                    stramWrite.WriteLine("安安");
                    stramWrite.WriteLine("狗狗");
                    stramWrite.Close();
                }
                catch (IOException ex)
                {
                    Debug.Log(ex.Message);
                    return;
                }
            }
        }

        /// 
        /// 讀取文建資料
        /// 
        /// 
        private List readFileTxtMessage()
        {
            StreamReader streamReader = new StreamReader(folderPath + vocabularName + attachment);
            while ((readtxtMessage = streamReader.ReadLine()) != null)
                readTxtMessageList.Add(readtxtMessage);

            streamReader.Close();
            return readTxtMessageList;
        }
    }
}
-----------------------------
 執行腳本(C#): 讀取記事本內文
using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

    VariousVocabularyCreateText.VocabularyData vocabularData = new VariousVocabularyCreateText.VocabularyData();

    void Start() {

        vocabularData.vocabularNameType = "bb";

        foreach (string message in vocabularData.readFileTxtMessage())
        {
            Debug.Log(message);
        }
    }
}
-----------------------------
 執行腳本(C#): 建立文建及換行
using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

    VariousVocabularyCreateText.VocabularyData vocabularData = new VariousVocabularyCreateText.VocabularyData();

    void Start() {
        vocabularData.vocabularNameType = "bb";
        vocabularData.createTxtMeesage();
    }
}

2016年11月2日 星期三

九宮格-拼圖遊戲-小品遊戲 (結束)

本文是九宮格拼圖遊戲-小品遊戲

圖片分割程式碼(請點選文字超連結)

腳本對印圖:



























圖片分割數量:




















結果圖:


 ----------------
開始遊戲九宮格圖片亂數變化 Script(C#):

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

[RequireComponent(typeof(DetectionObjcet))]
[RequireComponent(typeof(MoveImage))]
[RequireComponent(typeof(Gamesettlement))]
public class Jiugongge : MonoBehaviour
{
    public Sprite[] sprite = new Sprite[8];                                  // 預設圖片
    private int type = 9;                                    // 建立物件數量

    public List objcetList = new List();   // list 監管物件建立
    private GameObject spriteMaster;                        // sprite 管理物件
    private BoxCollider boxCollider;                        // Sprite Collider;

    private bool randomSw = false;                          // 亂數開關
    private int randomNumber;                               // 亂數
    private int limitObjcet = 0;                            // 限制物件

    private List numbers = new List();

    // Use this for initialization
    void Awake()
    {
        spriteMaster = new GameObject("SpriteMaster");  // sprite  管理
        spriteMaster.transform.position = Vector2.zero; // sprite 管理位置

        spriteSwitch();
    }

    /// 
    /// 視窗GUI
    /// 
    void OnGUI()
    {
        randomSw = (GUI.Button(new Rect(Screen.width / Screen.width, Screen.height / Screen.height, 100, 30), "拼圖重製")) ? true : false;

        if (randomSw.Equals(true))
        {
            //  notRepeatingRandom();
            Application.LoadLevel("aa");

        }
    }

    /// 
    /// 加入圖片亂數選擇
    /// 
    void spriteSwitch()
    {
        randomNumberListWithoutDuplicate(type);

        while (limitObjcet < type)
        {
            try
            {

                randomNumber = getNumberInList();

                createSprite().GetComponent().sprite = sprite[randomNumber];
            }
            catch
            {
                Debug.LogError("警告");
            }
            limitObjcet++;
        }
        show();
    }

    /// 
    /// 選取範圍
    /// 
    int getNumberInList()
    {
        int return_num = numbers[0];
        numbers.RemoveRange(0, 1);
        return return_num;
    }

    /// 
    /// 亂數排序
    /// 
    List randomNumberListWithoutDuplicate(int max)
    {

        for (int i = 0; i < max; i++)
            numbers.Add(i);


        for (int i = 0; i < numbers.Count; i++)
        {
            int temp = numbers[i];
            int randomIndex = Random.Range(i, numbers.Count);
            numbers[i] = numbers[randomIndex];
            numbers[randomIndex] = temp;
        }

        return numbers;
    }

    /// 
    /// objcet 位置
    /// 
    void show()
    {

        int objcetNumber = 0;

        foreach (GameObject objcet in objcetList)
        {
            objcetNumber += 1;
            objcet.transform.SetParent(spriteMaster.transform);
            objcet.name = "Image" + objcetNumber;

            switch (objcetNumber)
            {
                case 1:
                    objcet.transform.position = new Vector2(-3.4f, 0);
                    break;
                case 2:
                    objcet.transform.position = new Vector2(-3.4f, 3.4f);
                    break;
                case 3:
                    objcet.transform.position = new Vector2(-3.4f, 6.8f);
                    break;
                case 4:
                    objcet.transform.position = new Vector2(0, 0);
                    break;
                case 5:
                    objcet.transform.position = new Vector2(0, 3.4f);
                    break;
                case 6:
                    objcet.transform.position = new Vector2(0, 6.8f);
                    break;
                case 7:
                    objcet.transform.position = new Vector2(3.4f, 0f);
                    break;
                case 8:
                    objcet.transform.position = new Vector2(3.4f, 3.4f);
                    break;
                case 9:
                    objcet.transform.position = new Vector2(3.4f, 6.8f);
                    break;
            }
        }
    }

    /// 
    /// 建立物件
    /// 
    /// 
    GameObject createSprite()
    {

        GameObject objcet = new GameObject("Image");

        objcetAddComponentFunction(objcet);
        ComponentSetting();

        objcetList.Add(objcet);
        return objcet;
    }

    /// 
    /// 物件加入組件
    /// 
    /// 
    void objcetAddComponentFunction(GameObject objcet)
    {
        objcet.AddComponent();
        boxCollider = objcet.AddComponent();
    }

    /// 
    /// 組件設定
    /// 
    void ComponentSetting()
    {
        boxCollider.size = new Vector3(3.4f, 3.4f, 0);
    }
}

---------------
Script(c#) 偵測方位物件
using UnityEngine;
using System.Collections;

public class DetectionObjcet : MonoBehaviour {

    private Jiugongge jiugongge;                    // 九宮格腳本
    private Ray ray1, ray2, ray3, ray4;             // 射線
    private RaycastHit hits1, hits2, hits3, hits4;  // 射線碰撞

    public GameObject objcetSprtieNull;             // 沒貼圖片物件
    public GameObject leftMoveObjcet,               // 射線偵測左邊物件
                      rightMoveObjcet,              // 射線偵測右邊物件
                      upMoveObjcet,                 // 射線偵測上邊物件
                      downMoveObjcet;               // 射線偵測下邊物件

    void Awake()
    {   
        jiugongge = gameObject.GetComponent();   // 取得物件腳本
        readOjbcetNoSprite();             
    }

    void Update()
    {
        RayColliderObjcet();

        // 射線方位
        ray1 = leftRayPoint();
        ray2 = rightRayPoint();
        ray3 = upRayPoint();
        ray4 = downRayPoint();
    }

    /// 
    /// 射線偵測
    /// 
    void RayColliderObjcet() {

        if (Physics.Raycast(ray1, out hits1))
            leftMoveObjcet = hits1.collider.gameObject;

        if (Physics.Raycast(ray2, out hits2))
            rightMoveObjcet = hits2.collider.gameObject;


        if (Physics.Raycast(ray3, out hits3))
            upMoveObjcet = hits3.collider.gameObject;

        if (Physics.Raycast(ray4, out hits4))
            downMoveObjcet = hits4.collider.gameObject;
    }

    /// 
    ///  左邊射線
    /// 
    /// 
    Ray leftRayPoint() {

        Vector2 vector2 = objcetSprtieNull.transform.position;

        Ray ray = new Ray(vector2, Vector2.left);
        return ray;
    }

    /// 
    /// 右邊射線
    /// 
    /// 
    Ray rightRayPoint()
    {
        Vector2 vector2 = objcetSprtieNull.transform.position;

        Ray ray = new Ray(vector2, Vector2.right);

        return ray;
    }

    /// 
    /// 向上射線
    /// 
    /// 
    Ray upRayPoint()
    {
        Vector2 vector2 = objcetSprtieNull.transform.position;

        Ray ray = new Ray(vector2, Vector2.up);

        return ray;
    }

    /// 
    /// 向下射線
    /// 
    /// 
    Ray downRayPoint()
    {
        Vector2 vector2 = objcetSprtieNull.transform.position;

        Ray ray = new Ray(vector2, Vector2.down);

        return ray;

    }

    /// 
    /// 尋找沒貼圖物件
    /// 
    void readOjbcetNoSprite()
    {
        foreach (GameObject objcet in jiugongge.objcetList)
        {
            if (objcet.GetComponent().sprite == null)
                objcetSprtieNull = objcet;
        }
    }
}

--------------------
偵測物件並且與沒有貼圖物件位置對調
using UnityEngine;
using System.Collections;

public class MoveImage : MonoBehaviour {

    private DetectionObjcet detectionObjcet;        // 選擇物件類別
 
    private Ray userRay;                            // 玩家射線
    private RaycastHit userRayHits;                 // 射線碰撞

    private Vector2 moveLimitPoint,                 // 無Sprite 物件位置(交換位置)
                    clickObjcetPoint;               // 射線探聽物件位置

    void Awake() {

        detectionObjcet = GetComponent();
    }

    void Update(){

        userRayFunction();
    }

    /// 
    /// 玩家發出射線 (可更改控制事件)
    /// 
    void userRayFunction() {

        userRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        moveLimitPoint = detectionObjcet.objcetSprtieNull.transform.position;

        if (Input.GetMouseButton(0))
        {
            if (Physics.Raycast(userRay, out userRayHits))
            {
                GameObject userOnclickObjcet = userRayHits.collider.gameObject;

                OnClickView(userOnclickObjcet);
            }
        }
    }

    /// 
    /// 探聽事件
    /// 
    /// 
    void OnClickView(GameObject objcet)
    {
        if (objcet == detectionObjcet.leftMoveObjcet)
        {
            clickObjcetPoint = objcet.transform.position;
            MoveObjcetFunction_Left(detectionObjcet.leftMoveObjcet, moveLimitPoint);
        }

        if (objcet == detectionObjcet.rightMoveObjcet)
        {
            clickObjcetPoint = objcet.transform.position;
            MoveObjcetFunction_Right(detectionObjcet.rightMoveObjcet, moveLimitPoint);
        }

        if (objcet == detectionObjcet.upMoveObjcet)
        {
            clickObjcetPoint = objcet.transform.position;
            MoveObjcetFunction_Up(detectionObjcet.upMoveObjcet, moveLimitPoint);
        }


        if (objcet == detectionObjcet.downMoveObjcet)
        {
            clickObjcetPoint = objcet.transform.position;
            MoveObjcetFunction_Down(detectionObjcet.downMoveObjcet, moveLimitPoint);
        }
    }

    /// 
    /// 偵測左邊物件_向右移動
    /// 
    /// 
    /// 
    void MoveObjcetFunction_Left(GameObject objcet, Vector2 point) {
  
        if(objcet.transform.position.x <= point.x)
        {
            objcet.transform.position = new Vector2(point.x, point.y);
        }
        detectionObjcet.objcetSprtieNull.transform.position = clickObjcetPoint;
    }

    /// 
    /// 偵測右邊物件_向左移動
    /// 
    /// 
    /// 
    void MoveObjcetFunction_Right(GameObject objcet, Vector2 point) {

        if (objcet.transform.position.x >= point.x)
        {
            objcet.transform.position = new Vector2(point.x, point.y);
        }
        detectionObjcet.objcetSprtieNull.transform.position = clickObjcetPoint;
    }

    /// 
    /// 偵測上邊物件_向下移動
    /// 
    /// 
    /// 
    void MoveObjcetFunction_Up(GameObject objcet, Vector2 point) {

        if (objcet.transform.position.y >= point.y)
        {
            objcet.transform.position = new Vector2(point.x, point.y);
        }
        detectionObjcet.objcetSprtieNull.transform.position = clickObjcetPoint;
    }


    /// 
    /// 偵測下邊物件_向上移動
    /// 
    /// 
    /// 
    void MoveObjcetFunction_Down(GameObject objcet, Vector2 point) {

        if (objcet.transform.position.y <= point.y)
        {
            objcet.transform.position = new Vector2(point.x, point.y);
        }
        detectionObjcet.objcetSprtieNull.transform.position = clickObjcetPoint;
    }
}

---------------------
遊戲結算(輸贏/其他方式結束遊戲) ※ 本程式只判斷遊戲是否拼圖正確
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Gamesettlement : MonoBehaviour
{

    private DetectionObjcet detctionObjcet;     // 選擇物件類別
    private Jiugongge jiugongge;                // 取得最先設定類別

    public Sprite winSprite;                    // 補區塊

    private bool win;                           // 輸贏數值

    void Awake()
    {

        detctionObjcet = GetComponent();
        jiugongge = GetComponent();
    }

    void Update()
    {

        readObjcetSprtie();

        if(win)
            detctionObjcet.objcetSprtieNull.GetComponent().sprite = winSprite;

        Debug.Log(win);
    }

    void OnGUI() {

        string str = (win.Equals(true)) ? "完成" : "未完成";

        GUI.Label(new Rect(Screen.width / Screen.width, Screen.height / Screen.height * 30f, 300, 30), str);

        if (Input.GetKey(KeyCode.Escape))
        {
            Application.Quit();
        }
    }

    /// 
    /// 讀取物件Sprite後及判斷位置
    /// 
    void readObjcetSprtie()
    {

        bool point1 = false, point2 = false, point3 = false, point4 = false, point5 = false, point6 = false,
            point7 = false, point8 = false;

        foreach (GameObject objcet in jiugongge.objcetList)
        {
            try
            {
                // sprite1 位置 x:-3.4f, y:0f;
                if (objcet.GetComponent().sprite.Equals(jiugongge.sprite[0]))
                {
                    if (objcet.transform.position.x.Equals(-3.4f) & objcet.transform.position.y.Equals(0))
                        point1 = true;
                }

                // sprite2 位置 x:-3.4f, y:3.4f;
                if (objcet.GetComponent().sprite.Equals(jiugongge.sprite[1]))
                {
                    if (objcet.transform.position.x.Equals(-3.4f) & objcet.transform.position.y.Equals(3.4f))
                        point2 = true;
                }

                // sprite3 位置 x:-3.4f, y:6.8f;
                if (objcet.GetComponent().sprite.Equals(jiugongge.sprite[2]))
                {
                    if (objcet.transform.position.x.Equals(-3.4f) & objcet.transform.position.y.Equals(6.8f))
                        point3 = true;
                }

                // sprite4 位置 x:0f, y:0f;
                if (objcet.GetComponent().sprite.Equals(jiugongge.sprite[3]))
                {
                    if (objcet.transform.position.x.Equals(0) & objcet.transform.position.y.Equals(0))
                        point4 = true;
                }

                // sprite5 位置 x:0f, y:3.4f;
                if (objcet.GetComponent().sprite.Equals(jiugongge.sprite[4]))
                {
                    if (objcet.transform.position.x.Equals(0) & objcet.transform.position.y.Equals(3.4f))
                        point5 = true;
                }

                // sprite6 位置 x:0f, y:6.8f;
                if (objcet.GetComponent().sprite.Equals(jiugongge.sprite[5]))
                {
                    if (objcet.transform.position.x.Equals(0) & objcet.transform.position.y.Equals(6.8f))
                        point6 = true;
                }

                // sprite7 位置 x:3.4f, y:0f;
                if (objcet.GetComponent().sprite.Equals(jiugongge.sprite[6]))
                {
                    if (objcet.transform.position.x.Equals(3.4f) & objcet.transform.position.y.Equals(0))
                        point7 = true;
                }

                // sprite8 位置 x:3.4f, y:3.4f;
                if (objcet.GetComponent().sprite.Equals(jiugongge.sprite[7]))
                {
                    if (objcet.transform.position.x.Equals(3.4f) & objcet.transform.position.y.Equals(3.4f))
                        point8 = true;
                }
            }
            catch
            {
                Debug.LogError("警告2: 強迫語法");
            }
        }

        // point 1-8 正確就可以過關
        if (point1 & point2.Equals(true) & point3.Equals(true) & point4.Equals(true) & point5.Equals(true)
            & point6.Equals(true) & point7.Equals(true) & point8.Equals(true))
            win = true;
        else win = false;
    }
}

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 匯入即可。





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();
    }
}