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