Unity 3D開發-C#腳本語言的一些基礎用法


Unity 中C#語言的一些基礎用法


本文提供全流程,中文翻譯。

Chinar堅持將簡單的生活方式,帶給世人!

(擁有更好的閱讀體驗 —— 高分辨率用戶請根據需求調整網頁縮放比例)


1

Lerp —— 線性插值



Mathf —— 數學運算函數庫

.Abs —— 函數,返回的是一個 float 值,返回的是一個絕對值

舉個栗子黑白88


//插值運算

//主相機背景色 = 顏色,插值(當前色,目標色,漸變速度)
_mainCamera.backgroundColor = Color.Lerp(_mainCamera.backgroundColor, Color.green, _animationSpeed * Time.deltaTime);

//主相機的正交尺寸 = 運算,插值(當前尺寸,目標尺寸,漸變速度)
_mainCamera.orthographicSize = Mathf.Lerp(_mainCamera.orthographicSize, 3.5f, _animationSpeed * Time.deltaTime);

//判斷是否達到目標值 運算,計算向量(當前值 減去 3.5f )< 0.01f的話   跳出
if (Mathf.Abs(_mainCamera.orthographicSize - 3.5f) < 0.01f) break;

2

LoadScene —— 載入場景



scenemanagement —— 場景管理器

SceneManager —— 場景管理

LoadScene —— 加載場景

.GetActiveScene() —— 獲取激活的場景

buildIndex —— 場景對應下標

舉個栗子黑白88

using UnityEngine;
using UnityEngine.SceneManagement;//引用命名空間

/// <summary>
/// 測試腳本
/// </summary>
public class Test : MonoBehaviour
{

    void Start()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); //重載當前場景
    }
}

3

Gizmos —— 小物件


注意:圖片必須是在 Gizmos 文件夾下,需要在代碼中“文件名.格式”寫出格式

OnDrawGizmos() —— 函數,是 MonoBehaviour 的生命周期函數 ,只在編輯狀態下,每幀都會運行

Gizmos.DrawIcon —— 在場景中某個位置繪制一張圖片

Gizmos.DrawCube —— 在場景中某個位置繪制一個Cube

Debug.DrawLine —— 畫一條線,這個方法也可在正常編譯代碼時打印用

舉個栗子黑白88

/// <summary>
/// 編輯器模式工作,每幀都會運行
/// </summary>
void OnDrawGizmos()
{
    Gizmos.DrawCube(transform.position, new Vector3(1, 1, 1));              //在Scene視窗下繪制一個Cube (位置,縮放比例)

    Gizmos.DrawIcon(transform.position, "Icon.png", true);                  //在Scene視窗下繪制一個圖片(位置,名稱.格式 ,是否允許擴展)

    Debug.DrawLine(transform.position, new Vector3(0, 10, 0), Color.green); //划線(開始位置,方向,顏色)
}

這里寫圖片描述


4

Normalize —— 向量


Vector3.Distance(transform.position,RightPos.position)>MaxDis

三維向量.距離(當前位置,目標位置) > 最大距離

舉個栗子黑白88

if (Vector3.Distance(transform.position,RightPos.position)>MaxDis)//如果大於設定距離MaxDis
{
    Vector3 pos = (transform.position - RightPos.position).normalized;//單位化向量,求得方向
    pos *= MaxDis;//給 pos 賦值,乘等於MaxDis
    transform.position = pos + RightPos.position;//當前位置賦值:最大距離+起點坐標點的位置
}

5

RelativeVelocity —— 相對速度


collision.relativeVelocity.magnitude > MaxSpeed

碰撞物體的.相對速度.大小 > 最大速度

舉個栗子黑白88

/// <summary>
/// 觸發檢測
/// </summary>
/// <param name="collision"></param>
private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.relativeVelocity.magnitude > MaxSpeed) //如果相對速度.大小>最大速度
    {
        Destroy(gameObject); //直接死亡
    }
    else if (collision.relativeVelocity.magnitude > MinSpeed && collision.relativeVelocity.magnitude < MaxSpeed) //相對速度在4-8之間
    {
        Render.sprite = HurtSprite; //更換圖片,受傷
    }
}

6

AudioSource —— 音頻源


AudioSource.PlayClipAtPoint(clip, transform.position);

音頻源.在指定位置播放裁剪音效(音效,位置)

舉個栗子黑白88

public  AudioClip      HurtClip;    //受傷音效


void Start()
{
    AudioPlay(HurtClip);//播放受傷音效
}


/// <summary>
/// 播放音效
/// </summary>
/// <param name="clip"></param>
public void AudioPlay(AudioClip clip)
{
    AudioSource.PlayClipAtPoint(clip, transform.position); //靜態方法:播放音效
}

7

CameraFollow —— 相機跟隨,插值


Mathf.Clamp(posX, 0, 18)

數學函數.范圍(限定目標,0,到 18之間)

舉個栗子黑白88


/// <summary>
/// 相機在指定范圍跟隨
/// </summary>
private void CameraFollow()
{
    //記錄Eva的橫坐標
    float posX = transform.position.x;

    //相機當前位置 = 插值(當前相機位置,目標位置(Mathf.Clamp-限定范圍:(限定posX,018之間))
    Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position, new Vector3(Mathf.Clamp(posX, 0, 18), Camera.main.transform.position.y, Camera.main.transform.position.z), SmoothFlo * Time.deltaTime);

}

8

String Split —— 字符串分割


例如一堆物體名字分別為:
Test-1
Test-2
Test-3
Test-4
Test-5

Split(‘-‘)函數:返回值為一個String數組

用-拆分,輸出的值為: 對應數組中:
String[0]:對應Test
String[1]:對應1,2,3,4,5

舉個栗子黑白88

SkinnedMeshRenderer[] parts = sourceTransform.GetComponentsInChildren<SkinnedMeshRenderer>(); //獲取所有帶有siki的物體位置信息,存入parts
foreach (var part in parts)//遍歷蒙皮網格數組中的每一個元素
{
    string[] nameStrings = part.name.Split('-'); //記錄名字,用-拆分,輸出的值為: “Test-1”----對應數組中------0:"Test" 1:"1"
    if (!data.ContainsKey(nameStrings[0]))       //如果字典GirlData中不包含 第一個資源預設下的子物體的名字
    {
        GameObject partObj       = new GameObject(); //實例化一個空物體
        partObj.name             = nameStrings[0];   //給物體改名
        partObj.transform.parent = target.transform; //設置父物體

        mydic.Add(nameStrings[0], partObj.AddComponent<SkinnedMeshRenderer>());  //把骨骼target身上的骨骼信息存起來
        data.Add(nameStrings[0], new Dictionary<string, SkinnedMeshRenderer>()); //存到字典中
    }

    data[nameStrings[0]].Add(nameStrings[1], part); //存儲所有的skin信息到字典
}

9

Toggle/Button|AddListener —— Toggle/按鈕添加監聽


需要引用命名空間:using UnityEngine.UI;

舉個栗子黑白88

private Toggle MyToggle;//自身的Toggle組件


/// <summary>
/// 初始化方法
/// </summary>
void Start()
{
    if (gameObject.name == "SaveButton") //如果按鈕名為:SaveButton
    {
        Button but = GetComponent<Button>();
        but.onClick.AddListener(LoadScene); //給當前物體上的Button組件添加監聽事件
        return;                             //不在向下執行
    }

    MyToggle = GetComponent<Toggle>();
    MyToggle.onValueChanged.AddListener(OnValueChangePerson); //綁定Toggle事件
    //MyToggle.onValueChanged.AddListener((bool value) => OnValueChangePerson(value)); //lambda表達式轉換為委托類型 
}


/// <summary>
/// Toggle方法,改變
/// </summary>
/// <param name="isChange"></param>
public void OnValueChangePerson(bool isChange)
{
    if (isChange)
    {
        Debug.Log("開關狀態 " + (isChange ? "On" : "Off"));
    }
}


/// <summary>
/// 加載其他場景
/// </summary>
public void LoadScene()
{
    SceneManager.LoadScene(1);
}

支持

May Be —— 搞開發,總有一天要做的事!


擁有自己的服務器,無需再找攻略!

Chinar 提供一站式教程,閉眼式創建!

為新手節省寶貴時間,避免采坑!


先點擊領取 —— 阿里全產品優惠卷 (享受最低優惠)


1 —— 雲服務器超全購買流程 (新手必備!)

2 —— 阿里ECS雲服務器自定義配置 - 購買教程(新手必備!)

3—— Windows 服務器配置、運行、建站一條龍 !

4 —— Linux 服務器配置、運行、建站一條龍 !





Chinar


END

本博客為非營利性個人原創,除部分有明確署名的作品外,所刊登的所有作品的著作權均為本人所擁有,本人保留所有法定權利。違者必究

對於需要復制、轉載、鏈接和傳播博客文章或內容的,請及時和本博主進行聯系,留言,Email: ichinar@icloud.com

對於經本博主明確授權和許可使用文章及內容的,使用時請注明文章或內容出處並注明網址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM