2020年6月2日 星期二

Maya_一鍵Delete History、Center Pivot、FreezeTransformations

*此教學使用Maya 2019
*最後更新時間 2020/06/05

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

Delete History、Center Pivot、FreezeTransformations
Maya的使用者肯定會以上的功能不陌生
並都會把它們做成Shelf Button方便使用

經常遇到要一次使用這三個功能的時候
所以就按三次
如果只按一次就完成三次操作
肯定能增加效率

1.點擊Script Editor

2.在MEL分頁輸入以下程式
如果沒有MEL分頁,點選旁邊的+號
*分號";"不可省略

DeleteHistory;
FreezeTransformations;
CenterPivot;


3.全選程式,用滑鼠中鍵拖曳到Shelf

4.出現的按鈕就是三合一按鈕了
但還有個問題,這個Icon誰看得懂他是做什麼的?

5.右鍵-Edit Popup

在Shelf分頁可以自訂Icon、顯示文字(可以空白)

Icon要放到指定版本路徑,例如:



6.接下來就能實驗三合一按鈕了







Maya_插件(免費)_CREASE+安裝與功能介紹

*此教學使用Maya 2019
*最後更新時間 2020/06/08


前言:
Crease Plus是由Baidhir Hidair大神開發的Maya插件
非破壞性布林功能非常強大
很適合用於製作硬表面的模型
很重要的一點是: 免費的!

實際用過覺得很實用
想推薦給有在使用Maya建模的朋友
不過發現大部分的人不會安裝插件

此時筆者想起自己有Blogger (上一篇都好幾年前了)
這便是此文章的由來

*筆者目前只用到幾項功能,有機會會繼續更新 多做介紹
*覺得好用的話可以給原作者一些小費和給五星評價喔
----------------------------------------------------------------------------------------------------------

直接看影片了解插件的功能:


到以下網址下載插件
選擇Standard License
在Name of fair price輸入0  (也可以選擇給作者小費喔)
再點Purchase
即可獲得插件壓縮檔

下載的rar裡有兩個資料夾
把他們解壓縮到文件-Maya對應版本的scripts資料夾
例如筆者的路徑如下:

做完以上步驟記得重開Maya
CreasePlus資料夾內有個readit文字文件說明安裝方法,可以先打開備用
重開Maya後點右下角的Script Editor

選擇Python分頁,如果沒有,點分頁旁的加號選擇Python
複製貼上以下程式碼:

import maya.cmds as cmds
from CreasePlus import CreasePlusMain
CreasePlusMain.start()

如圖:

點選右上角的Play按鈕

登登!如果出現工具列就代表安裝成功了!
滑鼠離開還會變半透明,作者真的用心!
當然沒人會想要呼叫工具時一直打開Script Editor
我們把程式碼全選,用滑鼠中鍵拖曳到Shelf欄做成按鈕

按鈕完成後會覺得不太順眼(筆者會XD)
可以編輯一下文字方便辨識,或直接換個Icon都可以
記得Save




由此就完成Crease+按鈕了!

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

接下來是功能介紹
眼睛圖案旁的三角形按了可以切換功能按鈕

----------------------------------------------------------------------------------------------------------
1. Bool OP
非破壞性布林


用者兩個物件做示範,左邊的方塊要被右側的圓角減去

確定位置後,對方塊(被布林模型) DeleteHistory + CleanAttributes
刪除圓角模型(布林用模型)

注意到屬性面板有多一個BoolOp屬性,CleanAttributes就是要刪除它
刪除方式如下圖


----------------------------------------------------------------------------------------------------------
2.Panel Bool
平面布林



左方塊要被右方塊布林成兩個物件

由此可在被布林模型切兩塊
(筆者在做槍的手把時常用這個方式)
一樣記得DeleteHistory的習慣
----------------------------------------------------------------------------------------------------------
3.Sel HardEdges
選取硬邊

假如想要選取模型的硬邊
先選模型再按按鈕即可








2016年9月4日 星期日

Unity_C#_彈孔的製作

*此教學使用Unity 5.4.0f3 (64-bit)免費版
*最後更新時間2016/09/05


本文將教學:
                     彈孔的製作

備註:此範例已經預設讀者已經會移動及發射物件
建議有射線基礎:Unity_C#_Physics.Raycast射線
----------------------------------------------------------------------------------------------------------



1.首先先準備好彈孔透明圖,選幾種不同種類的,例如玻璃和水泥地
例如這張圖,設為Sprite
2.再來新增一Material設為Unlit/Transparent 或其他可帶透明的Shader
並拖曳Sprite過去

3.新增一Plane並把Material指定給它,此時可以看到彈孔已經出現在場景上
縮放適當大小並設為Prefab,場景上的彈孔就可以先刪了
用以上步驟多做幾個彈孔

4.開始新增撰寫腳本如下:

using UnityEngine;
using System.Collections;

public class Bullt_hole_02 : MonoBehaviour {

    public GameObject[] bulletTex; // 建立彈孔陣列
    public GameObject[] bulletTex_Glass; // 建立玻璃彈孔陣列

    void Update()
    {

        Vector3 fwd = transform.TransformDirection(Vector3.forward);
        RaycastHit hit;

        if (Input.GetButtonDown("Fire1") && Physics.Raycast(transform.position, fwd, out hit, 10) && Time.timeScale != 0)
        {
            if (hit.collider.tag == "Glass" || hit.collider.tag == "PlaneLight")
            {   Instantiate(bulletTex_Glass[Random.Range(0, 3)], hit.point, Quaternion.FromToRotation(Vector3.up, hit.normal)); }//隨機0、1、2
            else if (hit.collider.tag == "Wall" || hit.collider.tag == "Ground" || hit.collider.tag == "WallLight")
            {
                Instantiate(bulletTex[Random.Range(0, 3)], hit.point, Quaternion.FromToRotation(Vector3.up, hit.normal)); // 彈孔之position和rotation會符合被打中的物體
            }
        }
    }
}

由此可知此腳本的判斷是用射線判斷,而射線照理來說是由槍口發出
所以腳本應掛在在槍口位置
而使用標籤(tag)可使打中的物件不同留下不同彈孔
亂數則可以使彈孔不會每次都長一樣

一般射擊遊戲不會讓彈孔永遠存在(佔資源)
可以在彈孔身上掛上Destroy(gameObject, 5f);之類的程式碼


5.再來把腳本拖曳給槍的槍口位置,如效果不理想可以自行新增空物件
設定陣列Size並拖曳每一個Prefab,並為場景的物件加上標籤


6.效果如下(不知道為什麼傳GIF一直失敗):



2016年9月2日 星期五

Unity_C#_開頭動畫的製作

*此教學使用Unity 5.4.0f3 (64-bit)免費版
*最後更新時間2016/09/02


本文將教學:
                     開頭動畫的製作
----------------------------------------------------------------------------------------------------------

有別於Unity_C#_在Unity中播放影片,這次的教學不使用Plane
而使採用UGUI的RawImage來撥放影片
在開始前先準備好影片,
目前Unity支援的影片格式有: .mov、.mpg、.mpeg、.mp4、.avi、.asf

1.首先先新增一個2D場景,並設定Camera為Soild Color和Orthographic
(此步驟其實和播放影片無關,因為一般來說播放開頭動畫就切換場景了,
所以並不需要SkyBox也不須透視)


2.新增一個RawImage,
並把Canvas之Render Mode設為Screen Space - Camera,
UI Scale Mode設為Scale With Screen Size(這樣就不會在不同解析度出現問題)
Reference Resoulution設為此Unity作品最可能使用的螢幕尺寸



3.拖曳Camera至Render Camera位置


4.為了確保RawImage填滿整個畫面,
再Rect Transform按住Alt再選取最右下角的圖示


5.匯入影片(越大匯入越久),直接拖曳至Asset視窗即可,
可調整Quality(品質),理所當然調越高跑越慢


6.開始撰寫腳本如下

在此附上完整程式碼:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

[RequireComponent(typeof(AudioSource))]//必須要有AudioSource,任何加上此腳本的物件將自動加入AudioSource
public class OpeningMovie : MonoBehaviour {

    public MovieTexture movTexture;//影片
    private AudioSource AS_mov;//影片音軌

    void Start()
    {
        GetComponent<RawImage>().texture = movTexture;
        AS_mov = GetComponent<AudioSource>();
        AS_mov.clip = movTexture.audioClip;//這個MovieTexture的音軌
        movTexture.Play();
        AS_mov.Play();
    }


    void Update()
    {
        if (!movTexture.isPlaying)
        {
            UnityEngine.SceneManagement.SceneManager.LoadScene("01_Main_Menu");//載入場景
        }
    }
}





7.之後掛上腳本至RawImage,並把MovieTexture拖曳至腳本


8.此時按Play測試,效果如下:

很明顯的,影片播完後在進入下一個場景會直接出現一片空白,
那是因為影片播完時要進入下個場景,但下個場景還沒載入完,
這時很常見的錯誤,一般人不會考慮到這部分,於是要修改腳本

9.問題很明顯出在!movTexture.isPlaying,
當影片播放完後執行,而此時再載入場景已經太晚
這次使用StartCoroutine計時器來計時,
填入適當秒數,當時間到後直接換場景


以下附上完整程式碼:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

[RequireComponent(typeof(AudioSource))]//必須要有AudioSource,任何加上此腳本的物件將自動加入AudioSource
public class OpeningMovie : MonoBehaviour {

    public MovieTexture movTexture;//影片
    private AudioSource AS_mov;//影片音軌

    void Start()
    {
        GetComponent<RawImage>().texture = movTexture;
        AS_mov = GetComponent<AudioSource>();
        AS_mov.clip = movTexture.audioClip;//這個MovieTexture的音軌
        movTexture.Play();
        AS_mov.Play();
    }


    void Update()
    {
        StartCoroutine(LoadScene());
    }

    IEnumerator LoadScene()
    {
        yield return new WaitForSeconds(4.5f);//括號內填入影片時間
        UnityEngine.SceneManagement.SceneManager.LoadScene("01_Main_Menu");//載入場景
    }
}


10.實際測試,這次沒有出現空白,完美!




2016年8月23日 星期二

Unity_C#_(基礎)SetActive顯示隱藏物件

*此教學使用Unity 5.4.0f3 (64-bit)免費版
*最後更新時間2016/08/24


本文將教學:
                     顯示隱藏物件
                     SetActive用於判斷式
----------------------------------------------------------------------------------------------------------

SetActive是GameObject的一種方法,可以控制物件的顯示
等於是在Inspector控制是否打勾,有別於Destory會直接消滅物件


寫法為:
GameObject.SetActive(true);
GameObject.SetActive(false);

1.做個練習,先配置UGUI物件如下:



2.依這個介面來看,應是要按下Button才會出現Text,
所以先在Inspector視窗取消勾選


3.新增腳本,程式碼如下,函式給Button使用



4.把腳本拖曳至物件上(我習慣新增一個空物件),並且拖曳GameObject


5.接下來設定按鈕觸發的函式(...以後講解按鈕觸發函式就丟這篇)


6.運行時發現已經可以達到按下按鈕顯示物件的效果了,
但是如果是想要再按一次隱藏呢?
SetActive()用於判斷式使用activeInHierarchy,
所以可以修改函式程式碼如下:


7.效果如下:


如此一來,基本的UI顯示都可以得心應手了