1. 程式人生 > >Unity3D-基礎小知識(二)

Unity3D-基礎小知識(二)

寫一篇短文回答以下問題。如是做程式,請寫步驟,貼程式碼並解釋:
總結攝像機的使用方法。
如何應用左手法則決定方向,應用 Field of view 設定場景大小。
Field of view視角,透視投影時才有的特性。視角越大,能看到的視野也越大,對應的焦距也越短
Camera 繼承的類
Component(元件)
Camera 有哪些靜態屬性,用程式驗證並管理所有的 Camera ,並在程式中 enabled 部分有用的 Camera (切換攝像機)
Clear flag、blackground、culling mask、projection、size、field of view、clipping planes、Viewport Rect、Depth。
管理camera:
Camera1.camera.enabled = false;
Camera2.camera.enabled = true;
新增一個 Empty 遊戲物件, 新增一個 Camera 部件(Rendering 分類下),有什麼效果
具有攝像機的功能。
總結光源的使用。光源是 GameObject 嗎?
不是
給 Camera 加一個 聚光燈 玩玩! 實現 聚光燈 跟隨攝像機運動。
在camera中點選Add Component->Rendering->Light,然後設定為聚光燈。
給 sun 物件加 點光源 部件。 不許 給 sun 新增子物件。
在sun物件中中點選Add Component->Rendering->Light。
U3d 設計師 沒有將 Camera,Light 設計為 GameObject ,這給開發者帶來哪些好處?
將Camera,Light設計為component,方便開發者在講其作為元件新增到各種物件中,方便管理。
面嚮物件語言介面和超類有哪些異同?
IU3dActionCompleted 能設計為超類嗎?為什麼? 畫 UML 圖說明
可以,使用IU3dActionCompleted的類,需要繼承IU3dActionCompleted,並實現其方法,和使用介面類似。

U3dAction 能設計為介面嗎?為什麼? 畫 UML 圖說明
不能,因為需要作為基本的類,被U3dActionAuto和U3dActionMan繼承,方便U3dAction派生類被ActionManager管理,同時當U3dAction為介面時,每個使用它的類都必須實現其方法。

修改簡單工廠程式碼
新增一個新動作,MoveToTargetAction, 然後使用它持續追擊一個運動目標。
public class MoveToTargetAction : U3dActionAuto {
public Vector3 target;
public int speed;

    private IU3dActionCompleted monitor = null;

    public void setting(Vector3 target, int speed, IU3dActionCompleted monitor){
        this.target = target;
        this.speed = speed;
        this.monitor = monitor;
    }

    void Update () {
        float step = speed * Time.deltaTime;
        transform.position = Vector3.MoveTowards (transform.position, target, step);

        if (transform.position == target) { // Auto Destroy After Completed
            if (monitor != null) {
                monitor.OnActionCompleted(this);
            }
            Destroy(this);
        }
    }
}

public U3dAction ApplyMoveToTargetAction(GameObject obj, Vector3 target, int speed, IU3dActionCompleted completed){
MoveToTargetAction ac = obj.AddComponent ();
ac.setting (target, speed, completed);
return ac;
}
新增一個新動作,MoveToAB_Action, 然後使用它在兩個位置之間來回移動。(組合動作,務必由工廠正確的 Free 子動作)
public class MoveToAB_Action : U3dActionAuto {
public Vector3 targetA, targetB;
public int speed;

    private IU3dActionCompleted monitor = null;

    public void setting(Vector3 targetA, Vector3 targetB, int speed, IU3dActionCompleted monitor){
        this.targetA = targetA;
        this.targetB = targetB;
        this.speed = speed;
        this.monitor = monitor;
    }

    void Update () {
        float step = speed * Time.deltaTime;
        transform.position = Vector3.MoveTowards (transform.position, targetA, step);

        if (transform.position == targetA) {
            Vector3 temp = targetA;
            targetA = targetB;
            targetB = temp;
        }
    }
}

新增一個新動作,MoveToTargetAB_Action, 然後使用它在兩個目標之間來回移動。
public class MoveToTargeAB_Action : U3dActionAuto {
public Vector3 targetA, targetB;
public int speed;

    private IU3dActionCompleted monitor = null;

    public void setting(GameObject A, GameObject B, int speed, IU3dActionCompleted monitor){
        this.targetA = A.transform.position;
        this.targetB = B.transform.position;
        this.speed = speed;
        this.monitor = monitor;
    }

    void Update () {
        float step = speed * Time.deltaTime;
        transform.position = Vector3.MoveTowards (transform.position, targetA, step);

        if (transform.position == targetA) {
            Vector3 temp = targetA;
            targetA = targetB;
            targetB = temp;
        }
    }
}

簡單工廠的使用有哪些好處!按你的理解,簡單工廠還能在遊戲中做什麼?
工廠類含有必要的判斷邏輯,可以決定在什麼時候建立哪一個產品類的例項,客戶端可以免除直接建立產品物件的責任,而僅僅”消費”產品。簡單工廠模式通過這種做法實現了對責任的分割。
簡單工廠模式使用場景:工廠類負責建立的物件比較少;客戶只知道傳入工廠類的引數,對於如何建立物件(邏輯)不關心;簡單工廠很容易違反高內聚低耦合原則,因此一般只在很簡單的情況下應用。