unity2D學習(6)代碼控制角色、攝像機跟隨

1 爲角色添加代碼控制

爲Player添加一個New Script(我名命爲了PlayerController),就會發現在Assets文件夾下多出了一個C#文件。在Assets下面新建一個Script文件夾方便管理,並把C#文件放入到文件夾裏。

2 查看代碼控制涉及到input設置

控制角色暫時只涉及到左右移動和跳躍,需要先知道玩家是怎麼輸入,我們需要調用那些參數。

Edit->Project Settings->Input,然後看見我們要調用的參數Horizontal(水平的)和Jump(跳躍),以及它們的控制按鍵。

3 編寫控制角色代碼:左右移動 跳躍

爲一開始建立的C#文件進行代碼編寫,關於裏面deltaTime和update的選擇,文章最後會做解釋。

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

public class PlayerController : MonoBehaviour {
    //左右移動,跳躍
    public float moveSpeed;//移動速度
    public float jumpForce;//跳躍力
    public Rigidbody2D rig;//剛體
    
	// Use this for initialization
    //初始化
	void Start () {
        rig = GetComponent<Rigidbody2D>();//獲取主角剛體組件
        jumpForce = 575f;
        moveSpeed = 500f;
	}

    //每帖調用一次更新
    /*void Update () {
        Move();
	}*/

    //固定的時間間隔執行,不受遊戲幀率的影響
    void FixedUpdate()
    {
        Move();
    }

    //控制移動
    void Move()
    {
        //當按下你設置的建則返回一個有加速度的值,從1或者-1 過渡到0
        //得到正數對應正半軸,負數對應負半軸的方向
        float moveMultiple = Input.GetAxis("Horizontal");
        //當按下你設置好的鍵盤就會返回1和-1這兩個值
        float faceDirection = Input.GetAxisRaw("Horizontal");
        //角色左右移動
        if (moveMultiple!=0)
        {
            //velocity表示速度,Vector表示向量
            rig.velocity = new Vector2(moveMultiple * moveSpeed * Time.deltaTime, rig.velocity.y);//輸入x,y向量,數值*方向
        }
        //角色朝向修改
        if(faceDirection!=0)
        {
            //Scale,代表縮放,Localscale代表的是當前物體相對於父物體的縮放,通過正負不修改大小來實現左右朝向修改
            transform.localScale = new Vector2(faceDirection, 1);
        }
        //角色跳躍
        if (Input.GetButtonDown("Jump"))
        {
            rig.velocity = new Vector2(rig.velocity.x, jumpForce * Time.deltaTime);
        }
    }
}

4 攝像機跟隨

按照和角色一樣的方法,爲Main Camera添加Script並編寫代碼。

讓攝像機的位置橫縱更新和角色同步就可以了。

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

public class CameraController : MonoBehaviour {
    public Transform player;//角色
	// Use this for initialization
	void Start () {
        player = GameObject.Find("Player").GetComponent<Transform>();//獲取角色
	}
	
	// Update is called once per frame
	void Update () {
        transform.position = new Vector3(player.position.x, player.position.y, transform.position.z);
	}
}

獲取GameObject還可以通過unity拖拽,設置爲public的變量可以在unity中可見,例如上面的player,然後直接拖拽。

5 三種update介紹

上面的代碼中,我捨棄的了原本的Update函數,使用了FixedUpdate,介紹一下三種update大概就可以知道我爲什麼選擇FixedUpdate。

Update:每一帖調用一次,跟機器的性能有關係,有的性能好的機器帖率高,有的低導致在不同機器上效果不同。

FixedUpdate:固定時間間隔執行一次,一般默認0.02秒執行一次,一秒五十次,默認帖數50帖。可以在Edit->ProjectSetting->time  找到Fixedtimestep修改默認時間間隔。比較適合在物理邏輯和外設操作的處理中使用,GameObject的物理表現的更平滑,更接近現實。

LateUpdate:在所有Update函數調用後被調用,使用例子:角色移動,攝像機後跟隨。

增量時間(deltaTime)介紹

Time.deltaTime是每幀運行的時間,假設Update是每秒執行N次,幀數爲N,則Time.deltaTime = 1/N。這樣我們需要每秒移動10米,保證了在不同性能的電腦裏面的移動效果都是1秒10米。如果是每一帖移動1米,那麼有些電腦的性能好,他一秒可以移動60米,有的電腦差一秒只能移動10米,保證了在在不同電腦上運行的效果一致。

 

發佈了68 篇原創文章 · 獲贊 24 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章