Unity 小社課

第十堂 By: 貝絲

transform

  • 一個 Component
  • 儲存 Game Object 在場景座標中的位置、旋轉、尺寸比例
  • Position(位置):物件的位置,x: 左右、y: 上下、z: 前後
    • 2D 遊戲中除了 Camera的z會在-10之外其他都會是0(不然可能會照不到)
  • Rotation(旋轉):物件在三個座標軸上的旋轉角度
    • 2D 通常只會用到 z 軸
  • Scale(比例)物件在三個座標軸上的尺寸比例
    • 大於1:放大、0~1:縮小、小於0:鏡像
  • 所有 Transform 都是用 Vector3(三維向量)的資料型態在腳本中儲存和使用

transform 

transform 

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

public class deerManager : MonoBehaviour
{
    Vector2 vec2a, vec2b, vec2c;
    Vector3 vec3a, vec3b, vec3c;
    float exampleFloat;
    void Start()
    {
        //賦值
        vec2a = Vector2.up; //(0,1)
        vec2b = Vector2.right; //(1,0)
        vec3a = Vector3.forward; //(0,0,1)
        vec3b.Set(0,0,0); //直接設定Vector的值
        vec3b = new Vector3(25.0f, 20, 31);
        //運算
        vec2c = vec2a + vec2b; //(1,1) = (x1+x2, y1+y2)
        vec2c = vec2c * 10; //(10,10) = (k * x1, k * x2)
        vec2c *= 10; //同上

        exampleFloat = Vector2.Distance(vec2a,vec2b);
        exampleFloat = Vector2.Angle(vec2a, vec2b); //回傳起始&結束座標連線和水平方向的夾角
        exampleFloat = vec2a.magnitude; //回傳向量長度
        transform.position = Vector2.MoveTowards(transform.position, vec2c, 0.01f); 
        //(起點vector, 終點vector, 每次執行的移動距離(移動速度)) -> 寫在Update/FixedUpdate可以讓物件不斷向目標vector前進
        transform.position = Vector2.Lerp(transform.position, vec2c, 0.01f);
        //(起點vector, 終點vector, 兩個vector的差值) -> 更加平滑的移動(分點公式的兩線段比例)
        exampleFloat = vec3a.x;
        exampleFloat = vec3a.y;
        exampleFloat = vec3a.z; //Vector3 獨有

        transform.position = new Vector3(1, 0, 1);
        float x = transform.position.x;
        transform.localPosition = Vector3.zero; //相對於父物件的位置
        transform.Scale = Vector3.one; //GameObject於三維座標上的尺寸比例
        transform.localScale = new Vector3(-transform.localScale.x,transform.localScale.y,transform.localScale.z); //左右旋轉
        transform.rotation = Quaternion.identity; //GameObject的旋轉,以Quaternion(四元數)格式儲存,非常複雜,此處的identity為不旋轉
        transform.rotation = Quaternion.Euler(95,10,31); //以三維方式(歐拉角)旋轉
        transform.Translate(new Vector3(12, 15, 1)); //將position以一定的向量變動


    }
}

Vector

  • 向量是在坐標系中有方向、大小的值
  • Vector2:
    • 二維向量
    • 在平面座標系中與原點的差值
    • Vector2(x,y)

 

vector

down Shorthand for writing Vector2(0, -1).
left Shorthand for writing Vector2(-1, 0).
right Shorthand for writing Vector2(1, 0).
up Shorthand for writing Vector2(0, 1).
one Shorthand for writing Vector2(1, 1).
zero Shorthand for writing Vector2(0, 0).
  • Vector3:
    • 三維向量
    • 在三維空間中與原點的差值
    • Vector3(x,y,z)

 

vector

forward Shorthand for writing Vector3(0, 0, 1).
back Shorthand for writing Vector3(0, 0, -1).
up Shorthand for writing Vector3(0, 1, 0).
down Shorthand for writing Vector3(0, -1, 0).
left Shorthand for writing Vector3(-1, 0, 0).
right Shorthand for writing Vector3(1, 0, 0).
zero Shorthand for writing Vector3(0, 0, 0).
one Shorthand for writing Vector3(1, 1, 1).

vector2、vector3、transform

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

public class deerManager : MonoBehaviour
{
    Vector2 vec2a, vec2b, vec2c;
    Vector3 vec3a, vec3b, vec3c;
    float exampleFloat;
    void Start()
    {
        //賦值
        vec2a = Vector2.up; //(0,1)
        vec2b = Vector2.right; //(1,0)
        vec3a = Vector3.forward; //(0,0,1)
        vec3b.Set(0,0,0); //直接設定Vector的值
        vec3b = new Vector3(25.0f, 20, 31);
        //運算
        vec2c = vec2a + vec2b; //(1,1) = (x1+x2, y1+y2)
        vec2c = vec2c * 10; //(10,10) = (k * x1, k * x2)
        vec2c *= 10; //同上

        exampleFloat = Vector2.Distance(vec2a,vec2b);
        exampleFloat = Vector2.Angle(vec2a, vec2b); //回傳起始&結束座標連線和水平方向的夾角
        exampleFloat = vec2a.magnitude; //回傳向量長度
        transform.position = Vector2.MoveTowards(transform.position, vec2c, 0.01f); 
        //(起點vector, 終點vector, 每次執行的移動距離(移動速度)) -> 寫在Update/FixedUpdate可以讓物件不斷向目標vector前進
        transform.position = Vector2.Lerp(transform.position, vec2c, 0.01f);
        //(起點vector, 終點vector, 兩個vector的差值) -> 更加平滑的移動(分點公式的兩線段比例)
        exampleFloat = vec3a.x;
        exampleFloat = vec3a.y;
        exampleFloat = vec3a.z; //Vector3 獨有

        transform.position = new Vector3(1, 0, 1);
        float x = transform.position.x;
        transform.localPosition = Vector3.zero; //相對於父物件的位置
        transform.Scale = Vector3.one; //GameObject於三維座標上的尺寸比例
        transform.localScale = new Vector3(-transform.localScale.x,transform.localScale.y,transform.localScale.z); //左右旋轉
        transform.rotation = Quaternion.identity; //GameObject的旋轉,以Quaternion(四元數)格式儲存,非常複雜,此處的identity為不旋轉
        transform.rotation = Quaternion.Euler(95,10,31); //以三維方式(歐拉角)旋轉
        transform.Translate(new Vector3(12, 15, 1)); //將position以一定的向量變動


    }
}

其他小東西

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

public class deerManager : MonoBehaviour
{
    Vector2 vec2a, vec2b, vec2c;
    Vector3 vec3a, vec3b, vec3c;
    float exampleFloat;
    void Start()
    {
    	float exampleFloat = 2.5f;
        float exampleFloatAbs = Mathf.Abs(exampleFloat); //絕對值
 
        SpriteRenderer exampleSpriteRenderer = GetComponent<SpriteRenderer>();
 
        GameObject exampleObject1 = GameObject.Find("cat"); //用名字找Scene中的遊戲物件並回傳第一個符合的
        GameObject exampleObject2 = GameObject.FindGameObjectWithTag("Cat"); //用Tag找Scene中的遊戲物件並回傳第一個符合的
        GameObject.Destroy(this.gameObject); //摧毀以此Script作為Component的遊戲物件
        exampleSpriteRenderer.enabled = true; //exampleSpriteRenderer的啟用狀態,可直接修改(相當於框框打勾與否)
        this.enabled = true; //此Script的啟用狀態,相當於框框打勾與否
        exampleObject2.SetActive(false); //停用exampleObject2(相當於框框不打勾)
        float DeltaTime = Time.deltaTime; //在FixedUpdate中,這個值大約為0.02秒,其他地方則為一幀的時間
    }
}

讓角色動起來

方法一:使用位移方法

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

public class deerManager : MonoBehaviour
{
    private void Update() {        
        if (Input.GetKeyDown(KeyCode.RightArrow)) {
            this.gameObject.transform.Translate(new Vector2(5, 0) );
        } else if (Input.GetKeyDown(KeyCode.LeftArrow)) {
            this.gameObject.transform.Translate(new Vector2(-5, 0) );
        } else if (Input.GetKeyDown(KeyCode.UpArrow)) {
            this.gameObject.transform.Translate(Vector2.up);
        } else if (Input.GetKeyDown(KeyCode.DownArrow)) {
            this.gameObject.transform.Translate(Vector2.down);
        }  

    }
}
  • 利用 transform.Translate 使物體移動

 

方法二:改變物件座標

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

public class deerManager : MonoBehaviour
{
	public float speed = 5;
    
    private void Update() {        
        if (Input.GetKeyDown(KeyCode.RightArrow)){
            this.gameObject.transform.position += new Vector3(speed, 0, 0);
        } else if (Input.GetKeyDown(KeyCode.LeftArrow)) {
            this.gameObject.transform.position -= new Vector3(speed, 0, 0);
        } else if (Input.GetKeyDown(KeyCode.UpArrow)) {
            this.gameObject.transform.position += new Vector3(0, speed, 0);
        } else if (Input.GetKeyDown(KeyCode.DownArrow)) {
            this.gameObject.transform.position -= new Vector3( 0,speed,  0);
        }

    }
}
  • 利用 transform.position 使物體移動

 

使物件不斷移動,按鍵改變方向

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

public class deerManager : MonoBehaviour
{
	private Vector2 direction = Vector2.zero;
    
    private void Update() {        
        if (Input.GetKeyDown(KeyCode.UpArrow)) {
            direction = Vector2.up;
        } else if (Input.GetKeyDown(KeyCode.DownArrow)) {
            direction = Vector2.down;
        } else if (Input.GetKeyDown(KeyCode.RightArrow)) {
            direction = Vector2.right;
        } else if (Input.GetKeyDown(KeyCode.LeftArrow)) {
            direction = Vector2.left;
        }
    }
    
    private void FixedUpdate() {
    	transform.position = new Vector3(transform.position.x + direction.x, transform.position.y + direction.y, 0.0f);
    }
}
  • 使用一個Vector2 紀錄方向

Unity小社課 第十堂

By Beth chen

Unity小社課 第十堂

  • 80