国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity地形動(dòng)態(tài)生成的一些經(jīng)驗(yàn)記錄

這篇具有很好參考價(jià)值的文章主要介紹了Unity地形動(dòng)態(tài)生成的一些經(jīng)驗(yàn)記錄。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

????????正經(jīng)人誰(shuí)寫日記啊
? ? ? ? ? ? ? ? ? ? ? ? ????????????????????????--汪涵

????????我以前也一直認(rèn)為一個(gè)正經(jīng)忙碌的人哪有時(shí)間和精力去寫日記呢?

????????但是我錯(cuò)了,正因?yàn)槊G沒(méi)有精力,才要將重要的事情記錄下來(lái).

????????我記錄的東西也都是一些比較簡(jiǎn)單的Unity使用,C#程序設(shè)計(jì)的淺顯的東西.

????????但是誰(shuí)知道呢,當(dāng)我不停地探索之后,發(fā)出來(lái)的內(nèi)容,也許對(duì)于那些剛?cè)腴T的新人來(lái)說(shuō),會(huì)是一個(gè)引導(dǎo).

關(guān)于地形(terrain)對(duì)象

????????有四個(gè)重要參數(shù),地形寬度,地形長(zhǎng)度和地形高度,以及高度圖分辨率.

????????前面三個(gè)都好理解,主要是最后一個(gè)高度圖分辨率,它是一個(gè)二維的平面圖,用灰色深度來(lái)代表地形高低起伏的一個(gè)圖.(最黑為0)

? ? ? ? 它不直觀展示出來(lái),它只在程序計(jì)算地形高度時(shí)起作用,這就比較抽象.

? ? ? ? 并且高度圖的分辨率和地形分辨率(長(zhǎng)*寬)可以不是一樣的.

? ? ? ? 更低的分辨率在生成地形高度時(shí)會(huì)變得更陡峭.(這不是創(chuàng)建陡峭地形的方法,這種只會(huì)影響玩家的游戲體驗(yàn).)

? ? ? ? 一個(gè)1024*1024的地形圖如果配上513*513的高度圖那么整個(gè)地形的起伏會(huì)非常平滑

但是一個(gè)10240*10240的地形圖,如果配上513*513的高度圖,那么整個(gè)地形的起伏會(huì)變得非常突兀.

因?yàn)槊總€(gè)高度圖的像素點(diǎn),將要承擔(dān)10倍于1024*1024地形圖的起伏.

? ?

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

public class CreateTerrain : MonoBehaviour
{
    public int seed;
    public float terrainWidth = 1024f;//地形的寬度
    public float terrainLength = 1024f;//地形的長(zhǎng)度
    public int terrainHeight = 50;//地形的高度

    public Texture2D[] terrainTexture;
    public float perlinScale = 10.0f;
    public float[] perlinThreshold = {0.25f, 0.5f, 0.75f };

    private float randomOffsetX;
    private float randomOffsetY;
    public float centerHeight ;
    public float edgeHeight ;
    [Range(0, 2048)]
    public float slopeRadius;
    int terrainResolution;

    public static float Add(float a, float b)
    {
        float c = a + b;
        return c;
        //計(jì)算高度圖分辨率
    }

? ? 所以在創(chuàng)建高度圖分辨率時(shí)應(yīng)該和地形寬度和長(zhǎng)度進(jìn)行一個(gè)動(dòng)態(tài)改變.

將長(zhǎng)度和寬度相加,并且除以2,已達(dá)到清晰度和兼顧配置的需求.

 void Start()
    {
        terrainResolution = ((int)Add(terrainWidth,terrainLength)/2);
        Random.InitState(seed);
        randomOffsetX = Random.Range(0f, 10000f);
        randomOffsetY = Random.Range(0f, 10000f);

?????????Unity的任何游戲?qū)ο?都有2種坐標(biāo)系,一個(gè)是世界坐標(biāo)系,一個(gè)是本地坐標(biāo)系.如果是3D游戲就是三維坐標(biāo)系,如果是2D游戲就是二維坐標(biāo)系.

? ? ? ? 三維坐標(biāo)系實(shí)在是讓人頭大,它是計(jì)算機(jī)圖形學(xué)的一個(gè)基礎(chǔ)概念.在鏡頭控制系統(tǒng)中是最繞人的,在地形創(chuàng)建中只需要關(guān)注他的世界坐標(biāo)系即可.

 //創(chuàng)建一個(gè)簡(jiǎn)單的平面地形,并將其移動(dòng)到(0,0,0)坐標(biāo)
        Vector3 terrainPosition = new Vector3(terrainWidth,terrainHeight,terrainLength);
        TerrainData terrainData = new TerrainData();
        terrainData.heightmapResolution = terrainResolution;
        terrainData.size = terrainPosition;

????????Vector3類型是一個(gè)三維向量結(jié)構(gòu)體,將要?jiǎng)?chuàng)建的地形的長(zhǎng)寬高賦值給它,并在后面將值賦值給創(chuàng)建出的地形對(duì)象.

? ? ? ? TerrainData是Terrain游戲?qū)ο罄锩娴臄?shù)據(jù)對(duì)象,通過(guò)terrainData對(duì)象你才能控制terrain的具體數(shù)據(jù).(長(zhǎng)寬高,位置等等.)

? ? ? ? 而且還可以在游戲中實(shí)時(shí)控制地形.

????????

 GameObject terrainObject = Terrain.CreateTerrainGameObject(terrainData);//創(chuàng)建地形的方法

        float terrainHalfWidth = terrainWidth * 0.5f;
        float terrainHalfLength = terrainLength * 0.5f;

        Vector3 terrainOffset = new Vector3(-terrainHalfWidth, terrainHeight, -terrainHalfLength);
        terrainObject.transform.position += terrainOffset;

? ? ? ? 緊跟著就是創(chuàng)建地形方法.CreateTerrainGameObject();

? ? ? ? 創(chuàng)建出的只是一個(gè)地形對(duì)象,如果不給他設(shè)置任何的數(shù)值,它將是一個(gè)默認(rèn)的大小和位置.

? ? ? ? 生成地形時(shí)是從地形的左下角作為(0,0)的,所以1024*1024的地形將會(huì)在右上角處達(dá)到(1024,1024)坐標(biāo).

? ? ? ? 所以我還加了一個(gè)移動(dòng)地形對(duì)象的操作,將地形中心點(diǎn)對(duì)準(zhǔn)(0,0)

? ? ? ? 方法就是將地形大小除以2,之后對(duì)先有地形的三維坐標(biāo)進(jìn)行更改.

地形對(duì)象的坐標(biāo)系和其大小始終是一樣的,當(dāng)?shù)匦巫兇髸r(shí),他的坐標(biāo)系也會(huì)跟著變大,所以直接減去地形的長(zhǎng)寬的一半,并將新的位置賦值給地形對(duì)象的.transform.position,就可以實(shí)現(xiàn)將地形中心點(diǎn)移動(dòng)到世界坐標(biāo)系的(0,0)了.

關(guān)于地形貼圖(TerrainTexture2D)

????????地形貼圖支持多貼圖功能,因此只能使用數(shù)組形式來(lái)進(jìn)行賦值,哪怕只有一個(gè)貼圖

        TerrainLayer[] terrainLayers = new TerrainLayer[terrainTexture.Length];//TerrainLayer支持多貼圖功能,因此只能使用數(shù)組形式來(lái)進(jìn)行賦值,哪怕只有一個(gè)貼圖.
        for (int i = 0; i < terrainTexture.Length; i++)
        {
            terrainLayers[i] = new TerrainLayer();
            terrainLayers[i].diffuseTexture = terrainTexture[i];
            terrainLayers[i].tileSize = new Vector2(16, 16);
            terrainLayers[i].tileOffset = new Vector2(0, 0);
            terrainLayers[i].diffuseTexture.wrapMode = TextureWrapMode.Repeat;
            terrainLayers[i].normalMapTexture = null;
            terrainLayers[i].normalScale = 0.0f;
            terrainLayers[i].smoothness = 0.0f;
            terrainLayers[i].metallic = 0.0f;
        }

? ? ? ? ? ?上面代碼接著地形創(chuàng)建.
? ? ? ? 聲明一個(gè)TerrainLayer[]類型的數(shù)組,這個(gè)數(shù)組就是貼圖圖層數(shù)組,他存儲(chǔ)了所有的預(yù)先在unity界面里導(dǎo)入的貼圖.
? ? ? ? 我這里導(dǎo)入了4張貼圖

? ? ? ? ? ? ? ? ? ? ? ? ?unity 動(dòng)態(tài)創(chuàng)建terrain,unity,游戲引擎

????????所以會(huì)循環(huán)4次,依次新建地形貼圖圖層對(duì)象,將貼圖賦予地形散射(漫反射)?紋理.

? ? ? ? 設(shè)置貼圖大小,設(shè)置地形層的紋理平鋪偏移量,設(shè)置地形層散射紋理的包裝模式為“重復(fù)”。這意味著當(dāng)紋理在地形表面被平鋪時(shí),如果紋理范圍超過(guò)地形表面,紋理將在邊界處重復(fù),從而覆蓋整個(gè)地形表面,將地形層的法線貼圖設(shè)置為 null,設(shè)置地形層的法線縮放值,設(shè)置地形層的光滑度,設(shè)置地形層的金屬度.

terrainData.alphamapResolution = terrainResolution;
        terrainData.terrainLayers = terrainLayers;
        float[,,] splatmapData = new float[terrainData.alphamapResolution, terrainData.alphamapResolution,terrainTexture.Length];

        for (int i = 0; i < terrainData.alphamapResolution; i++)
        {
            for (int j = 0; j < terrainData.alphamapResolution; j++)
            {
                float perlinValue = Mathf.PerlinNoise((float)(i+randomOffsetX) / terrainData.alphamapResolution * perlinScale, (float)(j+randomOffsetY) / terrainData.alphamapResolution * perlinScale);
                if (perlinValue <= perlinThreshold[0])
                {
                    splatmapData[i, j, 0] = 1;
                    splatmapData[i, j, 1] = 0;
                    splatmapData[i, j, 2] = 0;
                    splatmapData[i, j, 3] = 0;
                }
                else if(perlinValue <= perlinThreshold[1])
                {
                    splatmapData[i, j, 0] = 0;
                    splatmapData[i, j, 1] = 1;
                    splatmapData[i, j, 2] = 0;
                    splatmapData[i, j, 3] = 0;
                }
                else if (perlinValue <= perlinThreshold[2])
                {
                    splatmapData[i, j, 0] = 0;
                    splatmapData[i, j, 1] = 0;
                    splatmapData[i, j, 2] = 1;
                    splatmapData[i, j, 3] = 0;
                }
                else
                {
                    splatmapData[i, j, 0] = 0;
                    splatmapData[i, j, 1] = 0;
                    splatmapData[i, j, 2] = 0;
                    splatmapData[i, j, 3] = 1;
                }
            }
        }
        terrainData.SetAlphamaps(0, 0, splatmapData);

? ? ? ? ?接下來(lái)進(jìn)行貼圖混合,I,J的最大值分別取地形高度圖分辨率,perlinThreshold在前面變量聲明時(shí)已經(jīng)定義了一個(gè)固定的值,這里就是將4個(gè)貼圖按25%的比例進(jìn)行權(quán)重分配.

? ? ? ? 循環(huán)內(nèi)部利用柏林噪聲和隨機(jī)值偏移量來(lái)控制,柏林噪聲生成的數(shù)值,使用隨機(jī)值偏移量可以實(shí)現(xiàn)種子功能,在同一種子下,柏林噪聲生成的噪聲形態(tài)將會(huì)一樣.

????????unity 動(dòng)態(tài)創(chuàng)建terrain,unity,游戲引擎

? ? ? ? 對(duì)于貼圖交界處,unity會(huì)自動(dòng)混合平滑過(guò)渡,不需要另行編寫代碼.

? ? ? ? 最后,設(shè)置阿爾法maps將這個(gè)三維數(shù)組賦值給剛剛創(chuàng)建的地形上.

關(guān)于地形高度圖(terrainHeightMap)

float[,] circleHeightMap = CreateCircleHeightMap(terrainResolution, centerHeight / terrainHeight, edgeHeight / terrainHeight, slopeRadius);
 terrainData.SetHeights(0, 0, circleHeightMap);//應(yīng)用高度圖

float[,] CreateCircleHeightMap(int resolution, float centerHeight, float edgeHeight, float radius)
    {
        float[,] heightMap = new float[resolution, resolution];
        float halfWidth = terrainWidth * 0.5f;
        float halfLength = terrainLength * 0.5f;
        float maxDistSqr = radius;

        float transitionWidth = Mathf.Min(terrainWidth, terrainLength) * 0.2f;//計(jì)算高度過(guò)渡區(qū)的寬度.
        float transitionEndSqr = maxDistSqr+transitionWidth;//計(jì)算高度過(guò)渡區(qū)結(jié)束點(diǎn).
        float transitionStartSqr = maxDistSqr;


        for (int i = 0; i < resolution; i++)
        {
            for (int j = 0; j < resolution; j++)
            {
                float distX = (i / (float)resolution) * terrainWidth - halfWidth;
                float distY = (j / (float)resolution) * terrainLength - halfLength;
                float distSqr = distX * distX+ distY * distY;
                distSqr = Mathf.Sqrt(distSqr);

                if (distSqr <= transitionStartSqr)
                {
                    heightMap[i, j] = centerHeight;
                }
                else if (distSqr <= transitionEndSqr)
                {
                    float t = (distSqr - transitionStartSqr) / (transitionEndSqr - transitionStartSqr);
                    heightMap[i, j] = Mathf.Lerp(centerHeight, edgeHeight, t);
                }
                else
                {

                    heightMap[i, j] = edgeHeight;
                }
                
            }
        }
        
        return heightMap;
    }

上述代碼定義了一個(gè)從地圖最中心點(diǎn)開(kāi)始,根據(jù)輸入的園的半徑來(lái)獲得一個(gè)高區(qū)平臺(tái),并且在平臺(tái)邊緣會(huì)平滑過(guò)渡到地形的低區(qū).

? ? ? ? 利用平方距離和勾股定理來(lái)確定當(dāng)前的(i,j)點(diǎn)對(duì)于中心點(diǎn)的距離,t系數(shù)是一個(gè)歸一化數(shù)值,負(fù)責(zé)平滑過(guò)渡插值,而平滑過(guò)渡的寬度區(qū)域,則是用transitionWidth的系數(shù)0.2f來(lái)決定的,越大的系數(shù)將會(huì)讓過(guò)渡區(qū)域越寬,因?yàn)槭褂玫氖钦麄€(gè)地形長(zhǎng)寬的最大值,所以基本上在0.5f時(shí)就已經(jīng)能覆蓋整個(gè)地形.

根據(jù)實(shí)際情況來(lái)設(shè)置.

? ? ? ? 下圖為平臺(tái)高度60,地區(qū)高度10,過(guò)渡區(qū)寬度系數(shù)0.2f,所生成的地形.符合預(yù)期.

unity 動(dòng)態(tài)創(chuàng)建terrain,unity,游戲引擎文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-709380.html

到了這里,關(guān)于Unity地形動(dòng)態(tài)生成的一些經(jīng)驗(yàn)記錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Unity 使用柏林噪聲程序化生成地形

    Unity 使用柏林噪聲程序化生成地形

    參考教程鏈接 項(xiàng)目鏈接 ??對(duì)噪聲和柏林噪聲不了解的可以看下面這個(gè)講解。 柏林函數(shù)簡(jiǎn)介 ??簡(jiǎn)單來(lái)說(shuō)柏林噪聲是一種連續(xù)的、漸變的噪聲,不理解原理也無(wú)所謂,unity自帶有Mathf.PerlinNoise(X-coordinate,Y-coordinate);我們可以根據(jù)這個(gè)來(lái)制作更有層次性的柏林噪聲。你可以把這個(gè)

    2024年02月15日
    瀏覽(28)
  • 【簡(jiǎn)單詳細(xì)】Unity生成地形和UI小地圖實(shí)時(shí)展示人物位置的詳細(xì)制作過(guò)程

    【簡(jiǎn)單詳細(xì)】Unity生成地形和UI小地圖實(shí)時(shí)展示人物位置的詳細(xì)制作過(guò)程

    效果: 注意:一個(gè) 父物體 Map是一個(gè)純白色image,放到左上角,要加 Mask組件 哦?。?! ? ? ? 它的 兩個(gè)子物體, 其中一個(gè)(map)是顯示出地圖紋理的image,另外一個(gè)(mapPlayer)是一個(gè)小點(diǎn),我們也用image來(lái)表示,也就是效果圖上的 綠點(diǎn) 。 ? ? 我們把人物放進(jìn)去,掛載腳本

    2024年02月05日
    瀏覽(20)
  • Unity PS4/PS5搭建開(kāi)發(fā)環(huán)境/打補(bǔ)丁包和一些填坑經(jīng)驗(yàn)

    Unity PS4/PS5搭建開(kāi)發(fā)環(huán)境/打補(bǔ)丁包和一些填坑經(jīng)驗(yàn)

    首先,主機(jī)游戲PlayStation/Nintendo Switch都是比較閉塞的,開(kāi)發(fā)者賬號(hào)是必須的。 開(kāi)發(fā)環(huán)境有兩個(gè)部分,一是SDK Kit(各種開(kāi)發(fā)調(diào)試環(huán)境),二是Unity的支持庫(kù)(安裝后才能在Unity中切換到PS平臺(tái)); 需要嚴(yán)格按照SDK版本和對(duì)應(yīng)支持的Unity版本安裝開(kāi)發(fā)環(huán)境。 1. 安裝PS4/PS5 SDK: 登錄開(kāi)發(fā)

    2024年02月14日
    瀏覽(96)
  • Unity記錄一些glsl和hlsl的著色器Shader逆向代碼

    以下內(nèi)容一般基于 GLSL 300 之后 以下某些代碼行,是“偽代碼“,絕大部分是renderDoc 逆向產(chǎn)生標(biāo)準(zhǔn)代碼 本人OpenlGL零基礎(chǔ),也不打算重頭學(xué) 目錄 Clip() 剔除函數(shù) discard; FS最終顏色輸出 out 和最終顏色相加方程 從 discard; 命令可得知,一般通過(guò)透明度剔除, _26 == color.a _21.w 剛

    2024年02月07日
    瀏覽(50)
  • Unity動(dòng)態(tài)創(chuàng)建材質(zhì)球

    Unity動(dòng)態(tài)創(chuàng)建材質(zhì)球

    目錄 一、獲取貼圖 1:從Assets文件中獲取 2:從本地文件中獲取 二、創(chuàng)建材質(zhì)球 三、替換材質(zhì) 總結(jié) 前言 我們?cè)谧鲆恍〢R類似與涂涂樂(lè)的功能時(shí),經(jīng)常會(huì)用到給模型替換材質(zhì)球的功能。當(dāng)我們的用戶創(chuàng)建好貼圖時(shí)就需要?jiǎng)討B(tài)將新的貼圖轉(zhuǎn)換成材質(zhì)貼在模型上。他的原理其實(shí)很

    2024年02月05日
    瀏覽(17)
  • 【Unity入門】22.動(dòng)態(tài)創(chuàng)建實(shí)例

    【Unity入門】22.動(dòng)態(tài)創(chuàng)建實(shí)例

    ? ? 大家好,我是Lampard~~ ????歡迎來(lái)到Unity入門系列博客,所學(xué)知識(shí)來(lái)自B站阿發(fā)老師~感謝? ? (1)Instantiate克隆創(chuàng)建對(duì)象 ? ? 昨天我們學(xué)習(xí)了預(yù)制體這個(gè)概念,在編輯器中使用預(yù)制體創(chuàng)建游戲?qū)ο?,并學(xué)習(xí)如何修改預(yù)制體等。 今天主要來(lái)學(xué)習(xí),如何在腳本中利用預(yù)制體創(chuàng)

    2024年02月05日
    瀏覽(15)
  • Unity Audio -- (2)創(chuàng)建動(dòng)態(tài)音效

    Unity Audio -- (2)創(chuàng)建動(dòng)態(tài)音效

    ????????本節(jié)的目標(biāo)是添加腳步聲到角色身上,當(dāng)角色走路時(shí),觸發(fā)動(dòng)畫事件并播放聲音。 ? ? ? ? 腳步聲是我們?cè)谡鎸?shí)世界中常常被我們所忽視的聲音,但腳步聲能夠傳達(dá)出許多環(huán)境信息。你現(xiàn)在可以花一小段時(shí)間繞著你周圍的環(huán)境走一走并仔細(xì)聽(tīng)聽(tīng)腳步聲。如果可能

    2024年02月08日
    瀏覽(18)
  • 10. unity預(yù)制體、動(dòng)態(tài)創(chuàng)建實(shí)體案例

    10. unity預(yù)制體、動(dòng)態(tài)創(chuàng)建實(shí)體案例

    1. 預(yù)制體 預(yù)制體 Prefab 就是事先制作好的物體,可以提高開(kāi)發(fā)效率。 1.1 預(yù)制體的制作 第一步 :在界面編輯器中先創(chuàng)建一個(gè)三維模型,比如創(chuàng)建一個(gè)正方體,命名為“骰子”,然后給它添加一個(gè)材質(zhì),再掛載一個(gè)旋轉(zhuǎn)的腳本,如圖所示: 第二步 :經(jīng)過(guò)上述步驟制作好模型后

    2024年02月05日
    瀏覽(21)
  • 【unity實(shí)戰(zhàn)】隨機(jī)地下城生成2——繪制地圖Tilemap的使用及一些技巧的使用(含源碼)

    【unity實(shí)戰(zhàn)】隨機(jī)地下城生成2——繪制地圖Tilemap的使用及一些技巧的使用(含源碼)

    參考原視頻鏈接: 【視頻】:https://space.bilibili.com/370283072 注意 :本文為學(xué)習(xí)筆記記錄,推薦支持原作者,去看原視頻自己手敲代碼理解更加深入 修改素材配置 切割圖片 繪制瓦片地圖 先新建我們的調(diào)色盤,保存好位置 拖入我們剛才切片好的素材 在房間預(yù)設(shè)體創(chuàng)建我們的瓦

    2024年02月13日
    瀏覽(22)
  • Unity 動(dòng)態(tài)創(chuàng)建Mesh 基礎(chǔ)方法與高級(jí)方法

    最近在做項(xiàng)目?jī)?yōu)化,注意到動(dòng)態(tài)創(chuàng)建Mesh時(shí),Unity提供了一套高級(jí)方法用于快速創(chuàng)建模型,特此記錄學(xué)習(xí)一下。 關(guān)于Mesh的基本概念再次不在闡述,可以參考Unity Mesh 官方文檔,介紹的很詳細(xì),其中 基礎(chǔ)方法 包括:SetVertices、SetNormals、SetUVs、SetTriangles、SetIndices、SetColors、SetTa

    2024年03月27日
    瀏覽(18)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包