顯示具有 Unity 標籤的文章。 顯示所有文章
顯示具有 Unity 標籤的文章。 顯示所有文章

2019年12月3日 星期二

【自製小遊戲】水平思考猜謎(海龜湯)


海龜湯的玩法是由出題者提出一個難以理解的事件,參與猜題者可以提出任何問題以試圖縮小範圍並找出事件背後真正的原因。但出題者僅能以「是」、「不是」或「沒有關係」來回答問題。

本遊戲蒐集各種論壇、平台的42個題目,提供給想玩海龜湯卻愁找不到題目的你們。
決定好一位出題者,就可以在聚會、活動和排隊等待種種狀況下與眾人同樂。


2019年8月15日 星期四

【Unity官方教學分享】移動和旋轉(Translate and Rotate)

網頁連結

如何使用transform下的兩個函式;Translate和Rotate去影響一個非剛體物件的位置和角度。

在以下的範例,我們可以看到移動Translate的引數是一個vector3,而數值為Z軸1,X及Y為0。
另外這個範例在Unity執行時的一個frame都會運作,因為它是寫在Unpate中。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TransformFunctions : MonoBehaviour
{
    void Start()
    {
        
    }

    void Update()
    {
        transform.Translate(new Vector3(0, 0, 1));
    }
}

2019年8月9日 星期五

【Unity官方教學分享】啟動物件(Activating GameObjects)

網頁連結

如何使用SetActive改變場景中物件Active狀態,並分辨activeSelf /activeInHierarchy確認物件Active狀態時的差別

要在腳本中設定物件的Active狀態,你可以使用SetActive函式。
SetActive函式可以在場景中切換物件的Activate狀態,在以下的範例裡,我們在Start函式下寫一條簡單的程式碼gameObject.SetActive(false)。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ActiveObjects : MonoBehaviour
{
    void Awake()
    {
        gameObject.SetActive(false);
    }
}
接著執行Unity時,你可以看到表示物件Active狀態的打勾被取消,場景物件消失,Hierarchy視窗下字體顯示也變淡了,表示此物件處於一個未被啟動的狀態。

2019年6月24日 星期一

【Unity】自製重力

Unity中的自製重力,以下是程式碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyKinematic : MonoBehaviour {
    public float gravity = 9.8f;//重力
    public Vector3 velocity = Vector3.zero;//速率
    public Vector3 deltaMove = Vector3.zero;//每偵位移量

    public float halfBoundHeight;//物體的一半高度
    public BoxCollider myCollider;//物體的Collider

    public Vector3 addForce = Vector3.zero;//跳躍施力
    // Use this for initialization
    void Start ()
    {
        myCollider = GetComponent<BoxCollider>();
        halfBoundHeight = (myCollider.size.y * 0.5f) * transform.localScale.y;
    }
 
 // Update is called once per frame
    void Update ()
    {
        HandleKeyInput();//按鍵輸入函式
    }

    void LateUpdate()
    {
        float deltatime = Time.deltaTime;
        UpdateGravity(deltatime);//重力
        UpdateMovement(deltatime);//落下
    }

    void UpdateGravity(float deltatime)
    {
        velocity.y -= gravity * deltatime; ;
    }

    void UpdateMovement(float deltatime)
    {
        //落下
        deltaMove = velocity * Time.deltaTime;

        //碰撞判定
        Vector3 raystart = transform.position + myCollider.center * transform.localScale.y;//射線起點
        float updown = 1;//方向判定
        if (velocity.y < 0)
            updown = -1;
        Vector3 raydir = Vector3.up * updown;

        float rayLength = Mathf.Abs(deltaMove.y) + halfBoundHeight;

        RaycastHit rhf = new RaycastHit();//射線
        if (Physics.Raycast(raystart, raydir, out rhf, rayLength))
        {

            if (rhf.collider != null && rhf.collider.gameObject.tag == "ground")//地板判定
            {
                deltaMove.y = rhf.point.y - raystart.y + halfBoundHeight * -updown;
                velocity = deltaMove / deltatime;
            }
        }
        transform.Translate(deltaMove, Space.World);//物體移動
    }

    void AddForce(Vector3 force)
    {
        velocity += force;
    }

    void HandleKeyInput()
    {
        if (Input.GetKeyDown(KeyCode.W))
            AddForce(addForce);

    }
}
至於重力為什麼要重新製作,一方面是為了對整套重力系統重新做理解,另一方面則是Unity物理擬真程度的問題,有些時候其實不需要那麼真實的物理效果,而自製的物理可以簡化掉一些不需要的結果。
以下是參考的網站:
設計我們的遊戲物理-簡易重力篇

2019年4月10日 星期三

【舊專案整理兼筆記】仿2048

2048遊戲實作。
成品下載連結:
透過手指滑動螢幕,組合數字,產生出2048吧!

2019/04/15追記:
手指滑動功能完成
手機版本完成and上架

2019/04/11追記:
1)上述第1, 2點bug修正。
2)追加數字產生動畫,新增標題、背景等UI。
3)新增重新開始按鈕。
4)新增遊戲結束和過關的字樣。


待修正的問題及功能:
1)沒有數字移動時還是會生成新的數字,這點和原版本不同。
2)在盤面上沒有空格時,若玩家按下無法合併數字的方向,會直接判斷為遊戲結束。
3)追加動畫,美化介面。
4)重新開始遊戲鈕。
5)手機板按鈕(或滑動。


2018年5月2日 星期三

【Unity】非固定式虛擬方向鍵製作Part.2

上一篇中我們完成了滑鼠按下及拖曳時的回饋圖示,接下來要把拖曳中滑鼠位置的數值,帶入角色圖中完成移動的效果。

首先我們直覺一點來考慮移動這件事,目前我們已經有了開始位置startPos和當前位置nowPos,那只要把這兩點距離算出來,就有一個數值可以作為移動量值。
開啟Controller腳本,在dragState = true;後加入以下程式碼:
float dis = Vector2.Distance(nowPos, startPos);
Vector2 dir = (nowPos - startPos).normalized;
actor.Translate(new Vector2(dis * dir.x, dis * dir.y) * speed);
Debug.Log(new Vector2(dis * dir.x, dis * dir.y) * speed);
float變數dis為nowPos到startPos的距離,接著用兩點距離的normalized數值作為方向並帶入變數dir,最後將 dis * dir * speed的數值帶入actor.Translate就完成目前的移動,可以用Debug.Log看看目前移動的數值。(這裡的speed是一個全域float變數,數值0.1f)

2018年4月19日 星期四

【Unity】非固定式虛擬方向鍵製作Part.1

這次來談談如何製作非固定式的虛擬方向鍵,完成後結果會像這樣:
首先我們開啟一個空白的Unity專案,Hierarchy視窗中生成一個空物件,並重新命名為Controller,並在這個Controller下新增一個名為Controller的腳本(本文使用C#)。

2018年4月1日 星期日

非固定式虛擬方向鍵移動測試

其實我也不知道這東西的正式名稱叫什麼,總之就是之前任天堂告可樂普的那個。
因為一直對手機遊戲上人物移動操控頗有興趣,而且這方法應該可以用在不少東西上,就來實作看看了,效果就和白貓的移動相同。
另外要如何這篇不會提到要如何實作,只是結果的展示,製作過程下一篇再開始。
如上圖所示,用滑鼠或手指按著螢幕中任意位置然後拖曳,畫面中的角色就會朝著拖曳的方向移動。
而畫面中的兩個圓是UI的Image,人物則是2D物件,另外有針對解析度做移動速度的調整以及對移動速度最大值做限制,大概就是這樣,這次就到這裡。
任天堂不要告我。

2018年3月14日 星期三

將滑鼠座標轉換至UI座標的方法

如題,最近剛好遇到所以做個紀錄。
這裡我們需要做的是把滑鼠座標轉換成Unity內UI物件的2D座標,也就是把Input.mousePosition轉換成RectTransform下的anchoredPosition。

2018年1月8日 星期一

使用腳本在OnClick下新增事件的方法

今天要是提的是在OnClick新增點擊事件的方法。
OnClick原本只要在屬性面板中新增點擊事件的腳本,就可以讓場景中的各個按鈕被點擊時能有不同的功能當然直接透過屬性面板新增非常方便,但總是有無法這麼做的時候,例如該按鈕的功能無法在執行前得知,這時就可以使用OnClick下的AddListener。
using UnityEngine;
using UnityEngine.UI;
public class AddListTest : MonoBehaviour 
{
    private Button button;
    void Start () 
    {
        button = GetComponent<Button>();
        button.onClick.AddListener(delegate () { ClickTest("AddListener test."); });
    }
    void ClickTest(string s)
    {
        Debug.Log(s);
    }
}
以上是一個在按鈕下新增函式的腳本,透過AddListener,新增ClickTest函式,同時傳入字串AddListener test.,執行結果如下;

2018年1月7日 星期日

【Unity】舊專案整理-小朋友下樓梯

今天整理電腦裡資料的時候,翻到一個懷念的檔案,就是我剛開始做Unity專案時的第一個小遊戲─小朋友下樓梯,想想反正今天也沒什麼事,就來把它修改的完整一點,以下是執行時的畫面。

2017年6月3日 星期六

【Unity官方教學分享】Enable和Disable

網頁連結

使用Unity內的有效化(Enable)與無效化(Disable)指令,可以簡單地控制元件是否有效。

以下的範例中,會使用腳本控制場景中Light元件的Enable。

2016年10月2日 星期日

【Unity】轉珠系統專案

下載連結
解壓縮密碼:JL1002
前陣子製作轉珠系統的專案檔,先分享出來給各位研究看看。
如上圖看到的,和上次番外篇提到的差不多。
專案內包含:
Scene下的場景。
Resources/Image下的珠子圖檔和背景圖。
Resources/Prefabs下的珠子物件。
Script下的四個腳本。

以下是四個腳本的名稱和功能:
PuzzleSystem
負責盤面和珠子初始化、尋找珠子群組、連結Combo、消除Combo。
PuzzleControl
負責控制轉珠的各階段狀態及呼叫PuzzleSystem下的函式。
Orb
負責儲存珠子的資訊(如珠子類型、編號、群組)及處理珠子動畫。
Finger
負責處理轉珠時珠子的交換。

這次就到這裡。

2016年9月20日 星期二

【自製小遊戲】記憶九宮格

google play連結
記憶九宮格,挑戰你記憶力的極限。
跟著畫面上的提示,依序點擊九宮格。
每答對三次點擊次數就會增加,你的記憶力能到多少等級呢?
素材:
http://piposozai.blog76.fc2.com/

2016年8月19日 星期五

【Unity官方教學分享】Update和FixedUpdate

網頁連結

Update在Unity中是最常使用的函式,遊戲執行的每一個frame都會呼叫Update,通常用來處理以下幾種動作:
沒有物理的物件移動。
簡易的計時器。
接收滑鼠、鍵盤的輸入。
另外要注意的是,每次呼叫Update的間隔時間並不相同。

FixedUpdate類似Update,但不同的是FixedUpdate會在Unity的物理階段呼叫,所以有物理性質的動作都建議在FixedUpdate中處理。
另外呼叫FixedUpdate的間隔時間每一次都會相同,開發者可以在Edit -> Project Settings -> Time中的Fixed Timestep欄位調整。

2016年8月17日 星期三

【Unity官方教學分享】Awake和Start

網頁連結

Awake和Start是在讀取腳本時優先被呼叫的函式,但它們之間還是有些許的不同。
Awake函式即使腳本沒有啟用(enable)依然會執行,適合使用在設定參照與初始化。
Start會在Awake之後,但只會在腳本為啟用狀態時呼叫,所以當腳本啟用後,需要優先執行一次的動作,就適合在Start中處理

以下是Unity函式執行的順序,除了初始化時的Awake和Start之外,也包含其他階段函式執行的順序
https://docs.unity3d.com/Manual/ExecutionOrder.html

2016年8月16日 星期二

【Unity官方教學分享】範圍和權限修飾詞

網頁連結

在程式碼中宣告變數的位置,會決定該變數可以被使用的範圍,以下面的程式碼為例。
using UnityEngine;
using System.Collections;

public class ScopeAndAccessModifiers : MonoBehaviour
{
    ////(1)
    public int alpha;////(3)

    private int beta = 0;////(4)
    private int gama = 5;

    void Example(int pens, int crayons)////(2)
    {
        int answer;
        answer = pens * crayons * alpha;
        Debug.Log(answer);
    }

    void Start(){}

    void Update ()
    {
        Debug.Log("Alpha is set to:" + alpha);
    }
    ////
}
(1)這是一個名為ScopeAndAccessModifiers的類別, 在括號中所有內容都為該類別的區域(local)變數或函式。
(2)在Example函式中宣告的變數;pens、crayons、answer,則是Example函式的區域變數,無法在該函式以外的地方存取這些變數。

2016年8月12日 星期五

【Unity官方教學分享】迴圈

網頁連結

迴圈是程序中重複執行程式碼的方法,本篇會提到四種迴圈種類,分別是while、do-while、for、foreach,首先對這四種迴圈建立腳本。

【自製小遊戲】水平思考猜謎(海龜湯)

遊戲連結 海龜湯的玩法是由出題者提出一個難以理解的事件,參與猜題者可以提出任何問題以試圖縮小範圍並找出事件背後真正的原因。但出題者僅能以「是」、「不是」或「沒有關係」來回答問題。 本遊戲蒐集各種論壇、平台的42個題目,提供給想玩海龜湯卻愁找不到題目的你們。 ...