Unity 常用語法(未完成)

position 位置
Vector2 or Vector3
pos = transform.position; //獲得遊戲物件的位置
rotate = transform.rotation.eulerAngles; //獲得遊戲物件當前的旋轉值
scale = transform.localScale; //獲得遊戲物件的縮放值

transform.position = new Vector3(0, 0, 0); //指定物件位置為座標點(0,0,0) 亦為中心點
transform.Rotate(new Vector3(0, 0, 1)); //Z軸旋轉1度
transform.localScale = new Vector2(1.5f, 1.5f); //更改為1.5倍大



在屬性視窗中點擊Add Component(增加組件)後,輸入Box C就會跳出Box Collider與Box Collider 2D,由於我們是2D遊戲,因此選擇Box Collider 2D。





—Collider – 碰撞器—

Collider會影響到滑鼠點擊事件、碰撞事件,他的範圍可以不跟物件的圖片一致,在Scene畫面中遊戲物件周圍的綠色框線就是Collider的範圍,一個遊戲物件可以同時擁有多個Collider以組成不規則的形狀,但是2D與3D不能同時存在。

Edge Collider 2D 邊緣碰撞器:
碰撞體為一條線,2D中可作為地面的碰撞使用

Polygon Coliider 2D 多邊形碰撞器 :
加入元件時會依照遊戲物件的Sprite自動形成不規則的碰撞體

IsTrigger觸發器
這個物件的碰撞器就會成為一個觸發器,碰撞的範圍就會變成一個觸發區域,這意思是物件將不再帶有「碰撞」的功能,其他物件與其相撞時會「穿」過去,而不會「碰撞」在一起,可以做為遊戲事件的展開,如傳送點、角色走到觸發區就觸發劇情等等。

Used By Effector 使用效果:
可以添加Effector元件使碰撞器有其他效果,如特定角度碰撞等等,由於這方面較複雜,暫時不多作介紹

—Rigidbody – 剛體—
剛體就是現實中的物體,帶有重力,摩擦力,反彈力。
剛體與碰撞體一樣分為2D(Rigidbody 2D)與3D(Rigidbody )。
兩個帶有剛體的物件互撞時,會互相反彈彈開。

Mass 質量
Linear Drag 線性阻力:物體在移動過程中所受到的阻力
Angular Drag 角阻力:物體在旋轉過程中所受到的阻力
Gravity Scale 重力倍率:物體所受重力的倍率,數值愈大重力愈強
Is Kinematic 運動學:物體將不受到剛體的物理運動影響,也就是關閉剛體的功能
Interpolate 差值:物體的運動與畫面更新率之間的平滑處理
None:不做平滑處裡
Interpolate:物體運動會在畫面更新之前做平滑處理
Extrapolate:物體運動會在畫面更新之後做平滑處理
Sleeping Mode 睡眠模式:
為了節省電腦效能,處理靜態的(未運動)剛體會進入睡眠以減少效能
Never Sleep:永不睡眠
Start Awake:剛體最初是清醒的,進入靜態後才會睡眠
Start Sleep:剛體最初是睡眠的
Collision Detection 碰撞偵測:
Discrete:離散的 我在2D上以連續的物體一直撞他她的Y軸默默地往下掉了,並且我以這個設定在撞擊物上,按下往下移動的話她會穿過地表,不知道原因為何。
Continuose:連續的 我在2D上一直撞他他的Y軸不會變動
Constraints 約束:
Freeze Position 凍結移動:有X軸跟Y軸兩個可以勾選,被勾選的軸將不受到物理影響
Freeze Position 凍結旋轉:只有Z軸可以勾選,勾選後物體將不會旋轉

CollisionEnter 碰撞事件
碰撞時,一方帶有Rigidbody(剛體),就會發生Collision事件。
OnCollisionEnter2D – 碰撞事件
當兩個2D碰撞器碰撞時會發生的事件
OnCollisionExit2D – 分開事件
當兩個2D碰撞器碰撞後,分開時所發生的事件
OnCollisionStay2D – 停滯事件
當兩個2D碰撞器碰撞後,未分開時會持續發生的事件,也可以想做是接觸著碰撞器

OnCollision事件都可以帶有一個參數,這個參數是碰撞到的對象的Collision2D(碰撞資訊)
由於可以獲取碰撞對象訊息,因此可以拿來當作判斷值。
Collision2D Coll
Coll.GameObject.name //印出名字

Trigger
Is Trigger 碰觸到其他碰撞體(或觸發區)時,且一方帶有剛體時,就會觸發Trigger事件
OnTriggerEnter2D – 觸發事件
當一個觸發區與一個碰撞體(或觸發區)觸碰時會發生
OnTriggerExit2D – 分開事件
當一個觸發區與一個碰撞體(或觸發區)觸碰後離開時會發生
OnTriggerStay2D – 停滯事件
當一個觸發區與一個碰撞體(或觸發區)觸碰後,未離開觸發區時會持續發生
跟CollisionEnter一樣,可以帶有參數。

Trigger 跟 CollisionEnter 唯一的區別就是一個不會穿過去,一個會穿過去

OnCollision與OnTrigger在一次碰撞中是不可能同時發生的,因為Trigger不發生碰撞,碰撞體不是Trigger,但是可以A跟B發生OnCollision,同時A跟C發生OnTrigger。

Component 組件

GetComponent<Move>();//獲取物件的Move組件
GetComponent – 獲取組件 Move – 之前寫的C# Script

可用於繼承
如建立一個Script 把一些常用的參數以及設定輸入

建立全域變數 C#ScriptName variableName
之後建立新的Script Component 在 Start() 處 輸入 variableName = GetComponent<C#Script>
之後可引用該C#裡的變數

如該C#裡面有Speed = 5
則可以 type Speed = variableName.Speed
Speed 就等於variableName的Speed了

射出的物體要造成傷害都需要安裝碰撞器
而如果不需要物理碰撞則需要以觸發器的方式觸發傷害,
但是由於子彈是從自己體內射出,因此會觸發到自己,因此可以建立與敵方區別

if (Input.GetKeyDown(KeyCode.Z))
        {
            Instantiate(Bullet, transform.position, new Quaternion(0, 0, 0, 0));
            bullet.GetComponent<shout>().Team = GetComponent<AllVariable>().Team;
        }

void OnTriggerEnter2D(Collider2D col) {
        if (col.GetComponent<shout>().Team != Team) {
            HP -= 10;
                Destroy(col.gameObject)
            if (HP < 0) {
                Destroy(gameObject);
            }
        }
    }


全域變數宣告
float speed;

void Start()
    {
        speed = GetComponent<AllVariable>().Speed;
    }

不能宣告
float speed = GetComponent<AllVariable>().Speed;
因為並非static變數,因此無法在程式一開始時就生成。


    void AImove() 移動
    {
        if (Mathf.Abs(posx - transform.position.x) > 0.1f)
        {
            if (posx < transform.position.x) //左邊
                transform.Translate(Vector2.left * speed * Time.deltaTime);
            else //右邊
                transform.Translate(Vector2.right * speed * Time.deltaTime);
        }
    }
    float lctime = 0;
    float lcneedtime = 3f;

    void AItime() 計時
    {
        if (lctime <= 0)  //如果LocateTime <= 0
        {
            lctime = lcneedtime;  //設定LocateTime為LocateNeedTime
            posx = Random.Range(-3, 3); //讓posX為亂數-3~3
        }
        else //否則LocateTime減去Time.deltaTime達成計時效果
        {
            lctime -= Time.deltaTime;
        }
    }
    float stime = 0.1f;
    float sneedtime = 0.1f;
    void AIShooting() 自動射擊
    {
        if (stime <= 0)  //ShootingTime <= 0
        {
            stime = sneedtime;  //設定ShootingTime為ShootingNeedTime
            GameObject bullet = (GameObject)Instantiate(BulletB,transform.position, new Quaternion(0, 0, 0, 0));
            //克隆一個Bullet在小飛兵的位置,轉型成GameObject型態將值給予bullet
            bullet.GetComponent<shoutmove>().Team = GetComponent<AllVariable>().Team;
            //設定bullet的BulletMove中的Team值 為 此物件的Unit的Team
            bullet.transform.Rotate(0, 0, 0);//旋轉180度
        }
        else //否則ShootingTime減去Time.deltaTime達成計時效果 當比零小時進入上面後變成0.1然後循環
        {
            stime -= Time.deltaTime;
        }








留言

這個網誌中的熱門文章

無法載入檔案或組件 'System.IO.Compression' 或其相依性的其中之一。

MongoDB 入門

DDD With MVC