❤❤Fungus新課程即將發布,快寫問卷拿優惠❤❤
顯示具有 教學 標籤的文章。 顯示所有文章
顯示具有 教學 標籤的文章。 顯示所有文章

2017年7月4日 星期二

Unity 打磚塊 2D 教學(下) 過關機制


下載完整可執行遊戲的專案 二合一(台幣約60元)

Player.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{

    [Header("水平移動速度")]
    public float speedX;
    Rigidbody2D playerRigidbody2D;

    void Start()
    {
        playerRigidbody2D = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        moveLeftOrRight();
    }

    float LeftOrRight()
    {
        return Input.GetAxis("Horizontal");
    }

    void moveLeftOrRight()
    {
        playerRigidbody2D.velocity = LeftOrRight() * new Vector2(speedX, 0);
    }
}
Ball.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Ball : MonoBehaviour
{
    public Text scoreText;
    int score;

    Rigidbody2D ballRigidbody2D;
    CircleCollider2D ballCircleCollider2D;

    [Header("水平速度")]
    public float speedX;

    [Header("垂直速度")]
    public float speedY;

    #region 教學理解用 可不寫
    [Header("實際水平速度")]
    public float velocityX;

    [Header("實際垂直速度")]
    public float velocityY;
    #endregion



    void Start()
    {
        ballRigidbody2D = GetComponent<Rigidbody2D>();
        ballCircleCollider2D = GetComponent<CircleCollider2D>();

        //切換成Kinematic模式
        //Uity 2018版以後不加這行的話 發球之前球會無法跟著球拍移動
        ballRigidbody2D.bodyType = RigidbodyType2D.Kinematic;

        scoreText.text = "目前分數:";
        Invoke("ballStart", 3);
    }

    void Update()
    {
        #region 教學理解用 可不寫
        velocityX = ballRigidbody2D.velocity.x;
        velocityY = ballRigidbody2D.velocity.y;
        #endregion

        if (Input.GetKey(KeyCode.Space))
        {
            ballStart();
        }
    }

    void ballStart()
    {
        if (isStop())
        {
            ballCircleCollider2D.enabled = true;
            transform.SetParent(null);
            ballRigidbody2D.velocity = new Vector2(speedX, speedY);
            
            //Unity 2018以後的版本需要加下面這行:
            //改回預設的Dynamic,使用Unity內建的物理運動規則
            ballRigidbody2D.bodyType = RigidbodyType2D.Dynamic;
        }
    }

    bool isStop()
    {
        return ballRigidbody2D.velocity == Vector2.zero;
    }

    void OnCollisionEnter2D(Collision2D other)
    {
        lockSpeed();
        if (other.gameObject.CompareTag(tags.磚塊.ToString()))
        {
            GameManager.brickCount--;
            Debug.Log("目前磚塊數量: "+GameManager.brickCount);
            GameManager.checLevelClearOrNot();
            other.gameObject.SetActive(false);
            score += 10;
            scoreText.text = "目前分數:" + score;
        }
    }

    void lockSpeed()
    {
        Vector2 lockSpeed = new Vector2(resetSpeedX(), resetSpeedY());
        ballRigidbody2D.velocity = lockSpeed;
    }

    float resetSpeedX()
    {
        float currentSpeedX = ballRigidbody2D.velocity.x;
        if (currentSpeedX < 0)
        {
            return -speedX;
        }
        else
        {
            return speedX;
        }
    }

    float resetSpeedY()
    {
        float currentSpeedY = ballRigidbody2D.velocity.y;
        if (currentSpeedY < 0)
        {
            return -speedY;
        }
        else
        {
            return speedY;
        }
    }
}
Trap.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Trap : MonoBehaviour {
    [Header("被撞到時候的位移")]
    public Vector3 offset;

    public int life;

    private void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.CompareTag(tags.球.ToString()))
        {
            life--;
            gameObject.transform.position += offset;
        }
        if (life<=0&&!GameManager.LevelClear)
        {
            GameManager.ReloadThisScene();
        }

    }

}
GameManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    [Header("可打破的磚塊初始數量")]
    public static int brickCount;

    static GameObject nextLevelButton;

    public static void ReloadThisScene() {
        Scene current = SceneManager.GetActiveScene();
        SceneManager.LoadScene(current.name);
    }

    public static bool LevelClear {
        get {

            if (brickCount<=0)
            {
                return true;
            }
            return false;
        }
    }
    public static void checLevelClearOrNot() {
        if (LevelClear)
        {
            showNextLevelButton();
        }
    }
    public void GotoScene(string next) {
        SceneManager.LoadScene(next);
    }


    void Start()
    {
        nextLevelButton = GameObject.FindGameObjectWithTag(tags.下一關按鈕.ToString());
        nextLevelButton.SetActive(false);

        brickCount = GameObject.FindGameObjectsWithTag(tags.磚塊.ToString()).Length;
        Debug.Log("一開始有 "+brickCount+" 個可打破的磚塊");
    }

    static void showNextLevelButton() {
        nextLevelButton.SetActive(true);
    }

    // Update is called once per frame
    void Update()
    {

    }
}

enum tags
{
    磚塊, 背景, 球拍, 球, 下一關按鈕
}
上集的程式碼與教學
http://www.morningfungame.com/2017/01/Unity-Arkanoid-breakout-tutorial-2D.html

2017年6月19日 星期一

讓Visual Studio 2017在Unity編輯程式時會自動完成內建方法名

讓Visual Studio 2017在Unity編輯程式時會自動完成內建方法名
(功用請看附圖)

記得先關閉 Visual Studio 跟 Unity 這兩個軟體

下載Visual Studio 2015 Tools for Unity 
(有支援Visual Studio2017版)
https://marketplace.visualstudio.com/items?itemName=SebastienLebreton.VisualStudio2015ToolsforUnity

安裝的時候一直按Next就可以了...

接著打開Unity 功能表Edit -> Preferences-->External Tools--External Script Editor.
如果有 Visual Studio 2017的話就選取它,這樣就設定完成了


如果沒有的話,點選Browse...輸入預設 Visual Studio軟體的資料夾路徑:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.exe

當然若你當初安裝 Visual Studio 時是另選安裝資料夾的話,記得去找一下

成功的話就可以這樣:輸入onc時自動出現相關的Unity內建方法讓你選擇






2017年5月9日 星期二

Unity 教學 2D 遊戲角色移動 程式篇





影片中的專案下載(台幣約30元)
https://gumroad.com/l/iLyXq

Unity 2D遊戲角色移動控制 程式篇
用淺顯易懂的方式解說如何實作2D角色移動的控制 包含走路與跳躍
而且能用 Physics2D.Linecast 判定是否在地板上,是的話才能跳躍(也就是不能在空中連跳)
並且附上2D platform Effector 的簡易說明

延伸閱讀:
Unity 5.5 2D Effectors 力場教學:2D平台, 橫向捲軸, 風吹, 瀑布, 漂浮, 黑洞, 爆炸, 輸送帶
http://www.morningfungame.com/2017/01/unity-55-2d-effectors-2d.html

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

public class Player : MonoBehaviour
{
    Rigidbody2D playerRigidbody2D;

    [Header("目前的水平速度")]
    public float speedX;

    [Header("目前的水平方向")]
    public float horizontalDirection;//數值會在 -1~1之間

    const string HORIZONTAL = "Horizontal";

    [Header("水平推力")]
    [Range(0, 150)]
    public float xForce;

    //目前垂直速度
    float speedY;

    [Header("最大水平速度")]
    public float maxSpeedX;

    [Header("垂直向上推力")]
    public float yForce;

    [Header("感應地板的距離")]
    [Range(0, 0.5f)]
    public float distance;

    [Header("偵測地板的射線起點")]
    public Transform groundCheck;

    [Header("地面圖層")]
    public LayerMask groundLayer;

    public bool grounded;

    public void ControlSpeed()
    {
        speedX = playerRigidbody2D.velocity.x;
        speedY = playerRigidbody2D.velocity.y;
        float newSpeedX = Mathf.Clamp(speedX, -maxSpeedX, maxSpeedX);
        playerRigidbody2D.velocity = new Vector2(newSpeedX, speedY);
    }

    public bool JumpKey
    {
        get
        {
            return Input.GetKeyDown(KeyCode.Space);
        }
    }

    void TryJump()
    {
        if (IsGround && JumpKey)
        {
            playerRigidbody2D.AddForce(Vector2.up * yForce);
        }
    }

    //在玩家的底部射一條很短的射線 如果射線有打到地板圖層的話 代表正在踩著地板
    bool IsGround
    {
        get
        {
            Vector2 start = groundCheck.position;
            Vector2 end = new Vector2(start.x, start.y - distance);

            Debug.DrawLine(start, end, Color.blue);
            grounded = Physics2D.Linecast(start, end, groundLayer);
            return grounded;
        }
    }

    void Start()
    {
        playerRigidbody2D = GetComponent<Rigidbody2D>();
    }

    /// <summary>水平移動</summary>
    void MovementX()
    {
        horizontalDirection = Input.GetAxis(HORIZONTAL);
        playerRigidbody2D.AddForce(new Vector2(xForce * horizontalDirection, 0));
    }

    void Update()
    {
        MovementX();
        ControlSpeed();
        TryJump();
        //speedX = playerRigidbody2D.velocity.x;
    }
}

2017年1月25日 星期三

Unity 打磚塊 2D 教學 (上)


下載完整可執行遊戲的專案 二合一(台幣約60元)

Player.cs

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

public class Player : MonoBehaviour {

    [Header("水平移動速度")]
    public float speedX;
    Rigidbody2D playerRigidbody2D;

    void Start () {
        playerRigidbody2D = GetComponent<Rigidbody2D> ( );
 }
 
 void Update () {
        moveLeftOrRight ( );
    }

    float LeftOrRight ( ) {
        return Input.GetAxis ( "Horizontal");
        }

    void moveLeftOrRight ( ) {
        playerRigidbody2D.velocity = LeftOrRight() * new Vector2 (speedX,0 );
        }
}


Ball.cs

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

public class Ball : MonoBehaviour
    {
    public Text scoreText;
    int score;

    Rigidbody2D ballRigidbody2D;
    CircleCollider2D ballCircleCollider2D;

    [ Header ( "水平速度" )]
    public float speedX;

    [Header ( "垂直速度" )]
    public float speedY;

    #region 教學理解用 可不寫
    [Header ( "實際水平速度" )]
    public float velocityX;

    [Header ( "實際垂直速度" )]
    public float velocityY;
    #endregion

    enum tags
        {
        磚塊,
        背景
        }

    void Start ( )
        {
        ballRigidbody2D = GetComponent<Rigidbody2D> ( );
        ballCircleCollider2D = GetComponent<CircleCollider2D> ( );

        //切換成Kinematic模式
        //Uity 2018版以後不加這行的話 發球之前球會無法跟著球拍移動
        ballRigidbody2D.bodyType = RigidbodyType2D.Kinematic;

        scoreText.text = "目前分數:";
        Invoke ( "ballStart",3 );
        }

    void Update ( )
        {
        #region 教學理解用 可不寫
        velocityX = ballRigidbody2D.velocity.x;
        velocityY = ballRigidbody2D.velocity.y;
        #endregion

        if ( Input.GetKey(KeyCode.Space) )
            {
            ballStart ( );
            }
        }

    void ballStart ( ) {
        if ( isStop ( ) )
            {
            ballCircleCollider2D.enabled = true;
            transform.SetParent ( null );
            ballRigidbody2D.velocity = new Vector2 ( speedX , speedY );
            
            //Unity 2018以後的版本需要加下面這行:
            //改回預設的Dynamic,使用Unity內建的物理運動規則
            ballRigidbody2D.bodyType = RigidbodyType2D.Dynamic;
            }
        }

    bool isStop ( ) {
        return ballRigidbody2D.velocity == Vector2.zero;
        }

    void OnCollisionEnter2D ( Collision2D other )
        {
        lockSpeed ( );
        if ( other.gameObject.CompareTag ( tags.磚塊.ToString ( ) ) )
            {
            other.gameObject.SetActive ( false );
            score += 10;
            scoreText.text = "目前分數:" + score;
            }
        }
    
    void lockSpeed ( )
        {
        Vector2 lockSpeed = new Vector2 ( resetSpeedX ( ) , resetSpeedY ( ) );
        ballRigidbody2D.velocity = lockSpeed;
        }

    float resetSpeedX ( )
        {
        float currentSpeedX = ballRigidbody2D.velocity.x;
        if ( currentSpeedX < 0 )
            {
            return -speedX;
            }
        else
            {
            return speedX;
            }
        }

    float resetSpeedY ( )
        {
        float currentSpeedY = ballRigidbody2D.velocity.y;
        if ( currentSpeedY < 0 )
            {
            return -speedY;
            }
        else
            {
            return speedY;
            }
        }
    }
下集的程式碼:
http://www.morningfungame.com/2017/07/Unity-Arkanoid-breakout-tutorial-2D-2.html

2017年1月11日 星期三

Unity 2D Effectors 力場教學:2D平台, 橫向捲軸, 風吹, 瀑布, 漂浮, 黑洞, 爆炸, 輸送帶,等速移動 效果

Unity 5.5 2D Effectors 力場教學:2D平台, 橫向捲軸, 風吹, 瀑布, 漂浮, 黑洞, 爆炸, 輸送帶,等速移動 效果

影片內容介紹了以下 Effector (中文名稱皆為自己翻譯 並非通用譯名)

Constant Force 2D ( 常數推力 )
功用:讓物件等速移動



Area Effector 2D ( 區域力場 )
功用:類似風吹或瀑布有特定方向的力場




Buoyancy Effector 2D ( 漂浮力場 )
功用:水池的效果


Point Effector 2D ( 點狀力場 )
功用:黑洞或是爆炸般的效果


Surface Effector 2D ( 表面力場 )
功用:輸送帶或迴轉壽司轉盤的效果


Platform Effector 2D ( 平台力場  )
功用:可以設定跳上某平台以後就下不來,或是特定角度才跳得上去




影片中使用到的專案下載
https://goo.gl/fE1O4O

2016年12月6日 星期二

Unity C# 程式心得分享 電風扇的各種風速 ( Enum + Switch )


using UnityEngine;
using System.Collections;

public class EnumAndSwitch : MonoBehaviour {

    enum Fanstate//宣告一個列舉Enum,基本用法類似不能轉風向的電風扇,同一時間只會有一種狀態
        {off,low,medium,high }//關閉,低風速,中風速,高風速

    enum GameState//遊戲狀態
        {
        StartMenu,
        Playing,
        Pauce,
        GameOver }//標題畫面,遊戲中,暫停,遊戲結束

    void Start () {
        //使用列舉Enum,同時按下關閉按鈕,注意字母大小寫有別
        Fanstate fanstate = Fanstate.medium;

        switch ( fanstate )
            {
            case Fanstate.off:
                Debug.Log ("電風扇關閉" );
                break;

            case Fanstate.low:
                Debug.Log ( "電風扇切換成低風速" );
                break;

            case Fanstate.medium:
                Debug.Log ( "電風扇切換成中風速" );
                break;

            case Fanstate.high:
                Debug.Log ( "電風扇切換成高風速" );
                break;
                
            default:
                Debug.Log ( "未知的電風扇狀態" );
                break;
            }

        GameState gameState = GameState.Playing;

        switch ( gameState )
            {
            case GameState.StartMenu:
                Debug.Log ( "切換到標題畫面" );
                break;

            case GameState.Playing:
                Debug.Log ( "正在玩遊戲" );
                Debug.Log ( "其他case的程式碼不會執行" );
                break;

            case GameState.Pauce:
                Debug.Log ( "遊戲暫停" );
                break;

            case GameState.GameOver:
                Debug.Log ( "遊戲結束" );
                break;

            default:
                Debug.Log ( "未知的遊戲狀態" );
                break;
            }
        }
}

2016年11月22日 星期二

Unity C# 程式心得分享 方法 + 重載


本教學系列絕非正統教學,但自我期許是趣味教學,裡面的中文變數只是為了教學使用,正式寫專案時還是建議使用英文變數,倘若各路高手發現內容有誤,煩請不吝指教以矯正視聽,感謝

using UnityEngine;
using System.Collections;

public class NoodleShop : MonoBehaviour
    {
    public class 店員
        {
        public string 名字;
        public 店員 ( string _名字 )
            {
            名字 = _名字;
            }

        public string 問客人想要的飲料 ( 客人 這位客人 )
            {
            return 這位客人.選擇的飲料;
            }

        public int 問客人想點的套餐編號 ( 客人 這位客人 )
            {
            return 這位客人.選擇套餐編號;
            }

        public void 供應單點 ( string 單點 )
            {
            Debug.Log ( 名字 + "送上來一份" + 單點 );
            }

        public void 供應陽春麵 ( )
            {
            Debug.Log ( 名字 + "送上來一份陽春麵" );
            }

        public void 供應組合套餐 ( int 套餐編號 , string 飲料 )
            {
            Debug.Log ( 名字 + "送上來" + 套餐編號 + "號套餐跟" + 飲料 );
            }

        }

    public class 客人
        {
        public string 名字;
        public int 選擇套餐編號;
        public string 選擇的飲料;

        public 客人 ( string _名字 , int _選擇套餐編號 , string _選擇的飲料 )
            {
            名字 = _名字;
            選擇套餐編號 = _選擇套餐編號;
            選擇的飲料 = _選擇的飲料;
            }

        public 店員 某位店員;

        void 準備點餐 ( )
            {
            Debug.Log ( 名字 + "準備點餐..." );
            }

        public void 點餐 ( string 單點 )
            {
            準備點餐 ( );
            某位店員.供應單點 ( 單點 );
            }

        public void 點餐 ( )
            {
            準備點餐 ( );
            某位店員.供應陽春麵 ( );
            }

        public void 點餐 ( int 套餐編號 , string 飲料 )
            {
            準備點餐 ( );
            某位店員.供應組合套餐 ( 套餐編號 , 飲料 );
            }
        }

    void Start ( )
        {
        店員 美女店員 = new 店員 ( "美女店員" );
        客人 帥哥 = new 客人 ( "帥哥" , 1 , "紅茶" );
        帥哥.某位店員 = 美女店員;

        //帥哥.點餐 ( 2,"紅茶");
        帥哥.點餐 ( 美女店員.問客人想點的套餐編號 ( 帥哥 ) , 美女店員.問客人想要的飲料 ( 帥哥 ) );
        }
    }
英文版程式碼

using UnityEngine;
using System.Collections;

public class NoodleShop : MonoBehaviour
    {
    public class Clerk
        {
        public string name;
        public Clerk ( string _name )
            {
            name = _name;
            }

        public string askingDrink ( Customer theCustomer )//問客人想要的飲料 
            {
            return theCustomer.selectedDrink;
            }

        public int askingComboMealNumber ( Customer theCustomer )//問客人想點的套餐編號
            {
            return theCustomer.selectedComboMealNumber;
            }

        public void servingMeal ( string meal )//供應單點
            {
            Debug.Log ( name + "送上來一份" + meal );
            }

        public void servingNoodle ( )//供應陽春麵
            {
            Debug.Log ( name + "送上來一份陽春麵" );
            }

        public void servingComboMeal ( int number , string drink )//供應組合套餐
            {
            Debug.Log ( name + "送上來" + number + "號套餐跟" + drink );
            }

        }

    public class Customer
        {
        public string name;
        public int selectedComboMealNumber;//選擇套餐編號
        public string selectedDrink;//選擇的飲料

        public Customer ( string _name , int _selectedComboMealNumber , string _drink )
            {
            name = _name;
            selectedComboMealNumber = _selectedComboMealNumber;
            selectedDrink = _drink;
            }

        public Clerk theClerk;

        void goingToOrder ( )//準備點餐
            {
            Debug.Log ( name + "準備點餐..." );
            }

        public void order ( string meal )//點餐
            {
            goingToOrder ( );
            theClerk.servingMeal ( meal );
            }

        public void order ( )//點餐
            {
            goingToOrder ( );
            theClerk.servingNoodle ( );
            }

        public void order ( int comboMealNumber , string drink )//點餐
            {
            goingToOrder ( );
            theClerk.servingComboMeal ( comboMealNumber , drink );
            }
        }

    void Start ( )
        {
        Clerk beauty = new Clerk ( "美女店員" );
        Customer guy = new Customer ( "帥哥" , 1 , "紅茶" );
        guy.theClerk = beauty;

        // guy.order  ( 2,"紅茶");
        guy.order ( beauty.askingComboMealNumber ( guy ) , beauty.askingDrink ( guy ) );
        }
    }

2016年11月8日 星期二

Unity C# 程式心得分享 靜態類別

本教學系列絕非正統教學,但自我期許是趣味教學,裡面的中文變數只是為了教學使用,正式寫專案時還是建議使用英文變數,倘若各路高手發現內容有誤,煩請不吝指教以矯正視聽,感謝


using UnityEngine;
using System.Collections;

public class Girlfriend : MonoBehaviour
    {
    public class 人類
        {
        const string 永遠的女神 = "波多野結衣";//設定好之後就不能再修改(執行之後無法再修改)

        public void 說出我的女神 ( ) {
            Debug.Log ( 名字 + "表示:我的女神只有一個!" );
            Debug.Log ("那就是"+永遠的女神+"啊啊啊啊啊" );
            }

        public string 名字;
        public static bool 吃辣;//static 靜態屬性 牽一髮而動全身
      //public bool 吃辣; //動態屬性 因人而異

        public void 回答吃不吃辣 ( )
            {
            if ( 吃辣 == true )
                {
                Debug.Log ( 名字 + "表示:我吃辣" );
                }
            else
                {
                Debug.Log ( 名字 + "表示:我不吃辣" );
                }
            }

        public 人類 ( string 父母取的名字 )//構造器 或稱為 建構函式
            {
            名字 = 父母取的名字;
            }

        public void 在一起 ( 人類 對象 ) {
            Debug.Log ( "就在這個時候"+名字+"跟"+對象.名字+"天雷勾動地火, 怦怦碰碰動動,他們在一起了!");
            王大明的女朋友.自己 = 對象;
            Debug.Log ( 名字+"現在跟"+王大明的女朋友.自己.名字+"穩定交往中");
            }
        }

    static class 王大明的女朋友 {
        public static 人類 自己;
        public static string 男朋友 = "大明";
        }

    void Start ( )
        {
        人類 王大明 = new 人類 ( "大明" );//出生 同時取好名字
        人類 陳阿香 = new 人類 ( "阿香" );//出生 同時取好名字
        人類 張阿珠 = new 人類 ( "阿珠" );//出生 同時取好名字

        人類.吃辣 = false;

        王大明.回答吃不吃辣 ( );
        陳阿香.回答吃不吃辣 ( );

        // 王大明的女朋友 女朋友2 = new 王大明的女朋友 ( );

        // 女朋友1.名字 = "真真";
        // 女朋友2.名字 = "泥泥";

        // Debug.Log ( "王大明有兩個女友 叫做"+女朋友1.名字+"跟"+女朋友2.名字);
        // Debug.Log ( "王大明迷失在他的美夢裡 永遠醒不來了");

        王大明.在一起 ( 陳阿香);
        Debug.Log ( "相愛容易 相處難 他們兩個分手了");
        王大明.在一起 ( 張阿珠 );

        王大明.說出我的女神 ( );
        }

    }


2016年10月24日 星期一

Unity C# 程式心得分享-- 物件 類別 屬性 方法

本教學系列絕非正統教學,但自我期許是趣味教學,裡面的中文變數只是為了教學使用,正式寫專案時還是建議使用英文變數,倘若各路高手發現內容有誤,煩請不吝指教以矯正視聽,感謝


using UnityEngine;
using System.Collections;

public class NightMarketLife : MonoBehaviour {

    
    class 人類 {//什麼是人類
        public string 稱號;//屬性 (特徵)
        public int 胃容量 = 100;//屬性 (特徵)

        public void 報上大名 ( ) {//方法 (行為) 
            Debug.Log ( 稱號+"的大名你沒有聽過嗎 哇哈哈!");
            }

        public void 吃東西 (店家 某個店家 ) {
            int 剩餘胃容量 = 胃容量 - 20;
            某個店家.產品數量 -= 1;
            Debug.Log (稱號+"吃了一份"+某個店家.產品名 );
            Debug.Log ( 稱號 + "的胃容量剩下" + 剩餘胃容量+"%" );
            Debug.Log ( 某個店家.產品名+"的數量為"+某個店家.產品數量 );
            }
        }


    class 店家 {
        public string 店家名;//屬性
        public string 產品名;//屬性
        public int 產品數量;//屬性

        public void 吆喝 ( ) {//方法

            Debug.Log ( 店家名+"的老闆吆喝著:來喔 好吃的 "+產品名+" 裡面坐喔~");

            }

        }


 void Start () {

        人類 王大明 = new 人類 ( );//王大明出生了
        王大明.稱號 = "三重王識賢";
        王大明.報上大名 ( );//調用方法(行為)

        店家 臭豆腐店 = new 店家 ( );
        臭豆腐店.店家名 = "阿香臭豆腐";
        臭豆腐店.產品名 = "臭豆腐";
        臭豆腐店.產品數量 = 30;
        臭豆腐店.吆喝 ( );

        王大明.吃東西 ( 臭豆腐店 );

 }
 
 // Update is called once per frame
 void Update () {
 
 }
}




2016年10月18日 星期二

Unity C# 程式心得分享 for迴圈 while迴圈 loop





本教學系列絕非正統教學,但自我期許是趣味教學,裡面的中文變數只是為了教學使用,正式寫專案時還是建議使用英文變數,倘若各路高手發現內容有誤,煩請不吝指教以矯正視聽,感謝


using UnityEngine;
using System.Collections;

public class Love : MonoBehaviour {

 // Use this for initialization
 void Start () {
        //沿著愛心逆時針順序跑
        //              A      C
        for (int i=1; i<=4 ; i++ )
            {
            //B
            Debug.Log ("for情書傳給第"+i+"位同學");
            //B
            }
   
        //=============================
  
        int w = 1;
        while (w<=4)
            {
            Debug.Log ( "while情書傳給第" + w + "位同學" );
            w++;
            }
   
        //=============================
  
        int d = 1;
        do
            {
            Debug.Log ( "do while情書傳給第" + d + "位同學" );
            d++;
            }
        while (d<=4);
        }
 
 // Update is called once per frame
 void Update () { 
 }
}

2016年10月12日 星期三

Unity C# 程式心得分享 邏輯運算 關係運算 且 或




本教學系列絕非正統教學,但自我期許是趣味教學,裡面的中文變數只是為了教學使用,正式寫專案時還是建議使用英文變數,倘若各路高手發現內容有誤,煩請不吝指教以矯正視聽,感謝

=======================

using UnityEngine;
using System.Collections;

public class Shopping : MonoBehaviour
    {
    void Start ( )
        {
        string 產品名稱 = "好折凳";
        string 產品別稱 = "七大武器之首";
        Debug.Log ( "主持人:各位觀眾 走過路過千萬別錯過" );
        Debug.Log ( "今天介紹" + 產品名稱 + "也就是傳說中的" + 產品別稱 + "他的特色有..." );

        int 女助理胸圍公分 = 92;
        Color 產品外觀 = Color.red;//紅色 這邊的Color是Unity內建的Color

        Debug.Log ( "色胚的身體起了變化" );

        Color 色胚喜歡的顏色 = Color.blue;//藍色
        int 色胚的大胸部標準公分 = 90;

        //以一擋百
        if ( 產品外觀 == 色胚喜歡的顏色 || 女助理胸圍公分 < 色胚的大胸部標準公分 )
            {
            Debug.Log ( "色胚:喔喔 看起來好棒 我要買~" );
            }
        else
            {
            Debug.Log ( "色胚:這東西我沒興趣!" );
            }

        int 產品價格 = 987;
        int 其他同類產品最低價 = 999;
        bool 產品多用途 = true;
        string 產品品牌 = "食神";

        Debug.Log ( "龜毛人的腦中激起了漣漪..." );

        //缺一不可
        if ( 產品價格 < 其他同類產品最低價 && 產品多用途 && 產品品牌 != "銷魂" )
            {
            Debug.Log ( "龜毛人:多方考慮後買下" + 產品名稱 + "會很划算!" );
            }
        else
            {
            Debug.Log ( "龜毛人:這個" + 產品名稱 + "不夠好,我不要買" );
            }
        }

    void Update ( )
        {
        }
    }

「Audionautix」創作的「Hot Mess」是根據「Creative Commons Attribution」(https://creativecommons.org/licenses/by/4.0/) 授權使用
演出者:http://audionautix.com/

「Audionautix」創作的「Yeah Yeah」是根據「Creative Commons Attribution」(https://creativecommons.org/licenses/by/4.0/) 授權使用
演出者:http://audionautix.com/

2016年10月2日 星期日

Unity C# 程式心得分享 ( Debug訊息 變數 if 判斷句 )


本教學系列絕非正統教學,但自我期許是趣味教學,裡面的中文變數只是為了教學使用,正式寫專案時還是建議使用英文變數,倘若各路高手發現內容有誤,煩請不吝指教以矯正視聽,感謝


Buy.cs 內容
記得新建C#檔案的時候就要取名為 Buy 大小寫有區別
========================


using UnityEngine;
using System.Collections;

public class Buy : MonoBehaviour
    {
    void Start ( ) //開始方法
        {
        //記得後面加半形的分號
        //string 紙條內容 = "去幫我買雞排";//字串
        int 雞排數量 = 1;//整數
        string 口味 = "梅子";
        int 奶茶數量 = 2;//整數
        float 奶茶甜度 = 0.3f; //有小數點的浮點數
        bool 要切 = false; //布林值 是否~~ 告訴我 是還否!!!
        //true代表是   false代表否
        bool 覺得教學有趣嗎 = true;


        Debug.Log ( "老闆我要" + 口味 + "口味的雞排" + 雞排數量 + "片" );
        Debug.Log ( "還有" + 奶茶數量 + "杯奶茶, 甜度" + 奶茶甜度 * 10 + "分糖" );

        if ( 要切 )//條件判斷式
            {
            //true時才執行
            Debug.Log ( "啊 對了 老闆 我的雞排要切" );
            }
        else
            {
            //false時才執行
            Debug.Log ( "啊 我的雞排不切喔~" );
            }


        if ( 覺得教學有趣嗎 )
            {
            Debug.Log ( "水喔!給你按個讚~" );
            }
        }


    void Update ( )
        {
        }
    }


=====================
影片的縮圖來源:Designed by Freepik

2016年9月4日 星期日

Unity 教學 漫畫式對話框


影片已改為下載觀看 
http://www.morningfungame.com/p/unity-fungus_14.html


摘要:

1.開啟新專案

2.下載安裝fungus

3.開啟fungus視窗

4.新增必備的Stage 舞台物件

5.新增必備的Character 角色物件
名字顏色改黑色字
設定人物的Portait 大頭照

6.新增必備的SayDialog 自訂對話物件
在Panel的image可替換漫畫對話框底圖
修改panel大小以符合對話框底圖

7.新增必備的 Flowchart 流程物件

8.新增並註冊角色專屬的StagePosition 舞台位置物件

9.指定套用自訂的漫畫對話框(Set Say Dialog)

10.Narrative-->Portait 指定秀出大頭照
不是Narrative-->Say 裡面的Portait設定,別搞混喔,Say裡面的Portait大頭照會跟對話框裡的文字互相避開,所以另外指定顯示。然後打開Wait Until Finished選項,就會先秀出大頭照再出現對話框

11.設定對話:
熱情奔放,創意無限{wc}
在這個moment 要爆了


 =========影片裡使用到的素材========
Designed by Freepik
Designed by Freepik
Kevin MacLeod」創作的「Just Nasty」是根據「Creative Commons Attribution」(https://creativecommons.org/licenses/by/4.0/) 授權使用

2016年9月2日 星期五

Unity 好用小工具 整合Photoshop 的 Psd Importer 教學

Unity 大約2019版開始有內建官方PSD importer,只要在photoshop裡把檔案轉存為PSB格式,就可以直接拉到Unity裡並保留圖層關係。
注意是PSB格式才有效,不是PSD,雖然它叫做PSD importer...
官方說明 或搜尋 unity package psd importer
https://docs.unity3d.com/Packages/com.unity.2d.psdimporter@4.0/manual/index.html



===以下是舊版文章的備份 僅供參考======



youtube教學影片
https://youtu.be/0FcfV_DLn6c

Unity PSD匯入器  Unity PSD importer

簡介:
可保留Photoshop的PSD檔圖層階層關係並且匯入Unity裡面,省下大量重新排列與對齊圖檔的時間

測試用的PSD檔下載
https://drive.google.com/drive/folders/0B9pF8Hbq-lgVaTByaU0wTmVjVHc


注意:
Photoshop 的PSD檔不能有混合選項或調整圖層之類的附加效果
目前測試可以支援形狀圖層與智慧型圖層

轉換混合選項或圖層樣式為一般圖層:
在Photoshop裡存檔以後點擊影像-->複製,只複製合併圖層不要打勾,按確定, 原版檔案就可以關掉了(避免不小心覆蓋到原始檔案)

按住Ctrl不放可跳著點選想要合併的圖層,再按Ctrl + E 合併圖層
按住Shift不放可連線點選想要合併的圖層,再按Ctrl + E 合併圖層

(此時範例PSD檔裡可以整理愛心與箭頭圖層)


下載 PSD importer
(網路上有另一個同名的插件,為了避免抓錯檔,可以從這裡下載)
下載(ChemiKhazi版)
https://github.com/ChemiKhazi/UnityPsdImporter


安裝 PSD importer
開啟一個新的Unity專案,Assets 裡新建一個Editor資料夾(名稱要一樣),把剛下載好的Unity PSD importer壓縮檔裡,bin資料夾底下的PhotoShopImporter.dll放到Editor資料夾裡
(若無法直接丟進Editor資料夾,可先解縮放到桌面上以後再丟進去)

匯入整理好的PSD:
整理好的PSD先丟到Assets裡,再點滑鼠右鍵,選擇PSD Importer




A.轉換為一般物件
選擇爸爸資料夾,等同於Photoshop PSD檔裡的爸爸群組,點擊 Sprite Creation 裡的 Create 2D Sprites按鈕,爸爸會變成父物件,底下的各個圖層會變成子物件,同時保留位置與階層關係


B.轉換為Canvas UI物件
功能表:GameObject-->UI新建一個Canvas物件,Assets裡在要轉換的PSD檔點滑鼠右鍵,選擇PSD Importer,選擇爸爸資料夾,等同於Photoshop PSD檔裡的爸爸群組,點擊場景裡的Canvas物件,再點擊Sprite Creation裡的Create UI Images按鈕,爸爸群組會變成Canvas底下的物件,同時保留位置與階層關係

轉成UI之前要新建一個Canvas物件




Kevin MacLeod」創作的「Cold Funk - Funkorama」是根據「Creative Commons Attribution」(https://creativecommons.org/licenses/by/4.0/) 授權使用

Kevin MacLeod」創作的「Hackbeat」是根據「Creative Commons Attribution」(https://creativecommons.org/licenses/by/4.0/) 授權使用
影片縮圖的素材:Designed by Freepik

2016年8月28日 星期日

檔案管理工具軟體 Q-Dir


Qdir 是個好用的檔案管理工具
除了最多4分割視窗以外,還可以開啟很多分頁,大大的減少了傳統檔案總管視窗所佔用的螢幕空間,簡便又聰明的搜尋功能,可以省下很多時間

詳情請看教學影片


==========================
教學影片使用到的素材版權宣告
「Audionautix」創作的「Texas Techno」是根據「Creative Commons Attribution」(https://creativecommons.org/licenses/by/4.0/) 授權使用
演出者:http://audionautix.com/

Designed by Freepik 

2016年5月31日 星期二

Unity 免費對話外掛推薦 Fungus + 常見問題



本網頁上次更新日期:2020年8月14日

Fungus 系列教學影片下載
http://www.morningfungame.com/p/unity-fungus_14.html


這是完全免費的而且開放原始碼

簡單的說這可以幾乎不需要寫程式,就能輕鬆的做出有分支的對話系統,還有現成的可點擊物件,可拖曳物件,很適合製作點擊式的冒險遊戲或問答類遊戲,還有密室脫逃類遊戲,重點是開發者很熱心的持續維護與解答,不是單純開發完丟檔案就算了(當然還是得用英文問啦...) 還有官方的教學影片(都有我翻譯的中文字幕)

===官方教學清單(中文字幕)===



如果你自己下載影片在電腦上看的話
下載已翻譯的SRT字幕(已更新到第14個教學)(1.5版之後的通關密語:95加滿)

===Fungus常見問題===

Q1.安裝好fungus後出現一堆錯誤訊息 或 FlowChart視窗是空白的
 A.可能Unity版本太新,跟Fungus不相容,建議安裝稍舊版的Unity
https://unity3d.com/cn/get-unity/download/archive
升級或降級Unity之前都記得要備份整個專案資料夾的檔案喔


Q2.我要安裝某個版本的Fungus
https://github.com/snozbot/fungus/releases
升級或降級Fungus之前都記得要備份整個專案資料夾的檔案喔


Q3.如何用新版Fungus的monobehaviour做觸發對話呢?
Unity X Fungus 新版3D遊戲裡觸發對話
請到Fungus 系列教學影片下載

Q4.Fungus有播放影片的功能嗎?
A.目前Fungus (3.8版)沒有播放影片的功能耶
你可能要找現成的C# 腳本來支援播放影片
搜尋:unity video player教學

Q5.Fungus切換場景的指令?
Load Scene

Q6.Fungus呼叫C#腳本的指令?
Invoke Method

Q7.用C#存取Fungus變數?
Flowchart.GetBooleanVariable
Flowchart.GetIntegerVariable
Flowchart.GetStringVariable

Flowchart.SetBooleanVariable
Flowchart.SetIntegerVariable
Flowchart.GetStringVariable

可以做成屬性Property來存取,相關教學:

Unity C# 程式 教學 Get Set 屬性 Property
https://youtu.be/GDzG0XN85io


Q8.如何修改Dialog對話框或Menu選項的樣式
Unity x Fungus 自訂對話框
請到Fungus 系列教學影片下載

問答猜謎小遊戲+計分功能 自訂menu 自訂dialog
請到Fungus 系列教學影片下載

Q9.離開遊戲的指令?
Quit
(這個指令在Unity裡測試時會沒有效果,輸出遊戲檔執行以後才會真的離開遊戲)

Q10.Fungus支援遊戲存檔讀檔的功能嗎?
Unity x Fungus 存檔 讀檔 教學 (Fungus 3.5 以上) 存取 進度
請到Fungus 系列教學影片下載

Q11.如何設定character出現的位置呢? 我想要自己拉它的位置
A.大致上是這樣:
功能表-->Tools-->fungus-->create-->stage position
改成你要的位置以後,拉到Stage物件的位置清單裡,預設有5個位置,那個數字5你就改成6,下面會多一個空白的欄位,然後把你的新stage position丟進去

Q12.如何自訂Portrait顯示的位置,而不是用預設值?
A.自訂StagePosition
請到Fungus 系列教學影片下載

Q13.用C#呼叫Block?
Flowchart.ExecuteBlock(目標Block的名稱);

Q14.我想整合Fungus跟C#小遊戲
A.簡易的做法是分開場景(scene),比方A場景有Fungus的flowchart,對話完後用Load Scene指令到小遊戲場景B,B場景結束後再讀取場景C接續對話,用C#腳本切換場景:
using UnityEngine.SceneManagement;
SceneManager.LoadScene("場景名稱");


Q15.當我的GameObject到達某個位置時,Fungus能夠偵測到以後執行某某Block嗎?
請到Fungus 系列教學影片下載
影片內是3D遊戲的作法
2D遊戲的話就是把ColliderXXX替換成ColliderXXX2D
然後RigidBody替換成RigidBody2D

Q16.我想要在A場景拿過物品後,到了其他場景又回來A場景時,物品不要重複出現
你可以在A場景裡開一個bool變數,內容設為false,叫做 [ 已拿某某物品 ]
每次進入A場景時就Load Variable讀取這個bool變數,第一次的時候一定是false,false的話就顯示物品,拿了物品以後就Set Varialbe [ 已拿某某物品 ] = true,但因為是跨場景,需要用Save Variable指令儲存變數的結果,不然讀取其他場景後,變數又歸零變成false
所以之後又回來A場景時,Load Variable發現為true,true的時候就把該物品關掉或Destroy

官方第11個教學有專門的介紹與中文字幕
11 Fungus variables 變數

Q17.關於內建的快轉對話功能,我想要取消掉
1.建立預設的對話框
Tools-->Fungus-->Create-->SayDialog

2.在Inspector視窗裡點選剛剛建立的對話框
把Dialog Input裡的CancelEnabled取消打勾

3.用Set Say Dialog指令套用剛剛的自訂對話框

註:更多自訂對話框的說明可以參考Q8

Q18.我想要在人物對話時,未說話人物的大頭照Portrait不要變暗
A. 找一下Hierarchy視窗內的Stage物件,把Dim Portraits(染色大頭照)的選項關掉
順帶一提,如果不要變暗,要改成其他顏色的話,就是修改DimColor(染色)

Q19.如何藉由按鍵觸發NPC對話?
A.參考這個影片:
Unity X Fungus 按鍵觸發NPC對話
請到Fungus 系列教學影片下載




2016年5月19日 星期四

C# 與 Unity 免費中文教學影片推薦


有了這些影片的話,至少可以不用去補習班上程式課程了


(上次更新日期:2019-04-22 移除掉一些已刪除的影片)

Unity C# 基礎入門教學
首先自我推薦本站製作的趣味教學

 ====C#入門=====

C#語言入門詳解
這套真的讓我搞懂物件跟類別了
建議從這個開始聽聽看 重點在於建立概念

小山的C#教學
台灣人做的教學 比較有親切感
而且他都用遊戲來做舉例


C#程式基礎
教的內容比較全面詳細)

====Unity====
Unity醬2D教學
台灣人做的2D遊戲教學


(我跟以上這些影片的作者或相關人士都沒有任何形式的利益關係)
(真心推薦!)