1. 程式人生 > >u3d011 祕密行動_學習記錄

u3d011 祕密行動_學習記錄

目錄

1.網格碰撞器

2.燈光

3.聲音AudioSource

3.人物移動

4. z軸越障礙相機跟隨

5.自動尋路NavMeshAgent

6.簡單計時器

7.畫線LineRenderer


 

1.網格碰撞器

 放入簡單模型

返回目錄

2.燈光

       Spot Light聚光燈(聚光/錐光)  最耗費資源  可以改變位置和角度  用於:手電,探照燈

     Directional Light平行光(方向光)  最省資源  可以改變角度  用於:太陽,全域性燈光

  Point Light點光源(由一個點向四周發射光源)  可以改變位置  用於:燈泡

  Area Light區域光(創造燈光貼圖烘焙時使用)  無法應用於實時光照

 cookie 皮影材質

 Intensity燈光強度

if(alermOn){//警報閃爍
	l1.intensity = Mathf.Lerp(l1.intensity,tar,Time.deltaTime*speed);
	if(l1.intensity < low+0.1)tar=high;
	if(l1.intensity > high-0.1)tar=low;	
}else if(l1.intensity>0.01){//關閉警報
	l1.intensity = Mathf.Lerp(l1.intensity,0,Time.deltaTime*2);
}

返回目錄

3.聲音AudioSource

 Play On Awake(在喚醒時開始播放)

 Loop(迴圈)

 Mute(靜音)勾選之後,靜音,但是音訊還是處於播放狀態。

 Volume(音量)為 0 時,無聲音;為 1 時,音量最大。

 Spatial Blend(空間混合)

 設定聲音是 2D 聲音,還是 3D 聲音。

 為 0 時,是 2D 聲音;為 1 時,是 3D 聲音。

Distance(範圍)

AudioSource.Play();//播放音訊剪輯。
AudioSource.Stop();//停止播放。
AudioSource.Pause();//暫停播放。

返回目錄

3.人物移動

 is Kinematic 勾上後完全由Transform控制(會導致穿牆)

 搖桿式移動

float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
if((Mathf.Abs(h)>0.1||Mathf.Abs(v)>0.1)&&Health.Hp>0){//運動

	float newSpeed = Mathf.Lerp(anim.GetFloat("Speed"),5.6f,moveSpeed*Time.deltaTime);
	anim.SetFloat("Speed",newSpeed);//控制前進

	Quaternion target = Quaternion.LookRotation( new Vector3 (h,0,v));//獲取鍵盤向量角度(wsad)
	transform.rotation =Quaternion.RotateTowards(transform.rotation,target,Time.deltaTime*rotateSpeed*100);
    //勻速旋轉*速度...需要一個較大的值
    //控制轉向

}else{
	anim.SetFloat("Speed",0);//停止
}

返回目錄

4. z軸越障礙相機跟隨

    void Start () {

		Camoffset = transform.position - player1.position;
		//原點
		CamoffsetPlayer= new Vector3 (transform.position.x,transform.position.y,-0.1f) - player1.position;
		//玩家頭上,z軸往後0.1

	}
	
	void FixedUpdate () {

		playerV3=player1.position + new Vector3(0,1,0);//檢測目標點
		Thit1V3 = transform.position + new Vector3(0,0,-0.5f);//上檢測發射點
		Thit2V3 = transform.position + new Vector3(0,0,-4f);//下檢測發射點

		Vector3 HtiToPlayer1 = playerV3 - Thit1V3;//射線1指向玩家
		Vector3 HtiToPlayer2 = playerV3 - Thit2V3;//射線2指向玩家

		Ray ray1 = new Ray(Thit1V3,HtiToPlayer1);//上檢測線
		Ray ray2 = new Ray(Thit2V3,HtiToPlayer2);//下檢測線


		//=[輔助畫線]======================
		Ray ray = new Ray(transform.position,playerV3 -transform.position);//相機視線
		Debug.DrawRay(ray.origin,ray.direction*20,Color.green);//射線畫線
		Debug.DrawRay(ray1.origin,HtiToPlayer1 ,Color.yellow);
		Debug.DrawRay(ray2.origin,HtiToPlayer2 ,Color.blue);
		//=======================
		
		bool isHit1 = Physics.Raycast(ray1,out Thit1, HtiToPlayer1.magnitude ,~LayerMask.GetMask(Tags.enemy,Tags.lasers));
		//上檢測射線 1 ,不與敵人,鐳射層 發生碰撞
		bool isHit2 = Physics.Raycast(ray2,out Thit2, HtiToPlayer2.magnitude ,~LayerMask.GetMask(Tags.enemy,Tags.lasers));
		//下檢測射線 2 ,不與敵人,鐳射層 發生碰撞

		if(isHit1&&isHit2){
			tarpos=( Thit1.collider.tag == Tags.player)?(player1.position + Camoffset):(player1.position + CamoffsetPlayer);
			//線1 看見玩家? 往原點移動:往玩家頭上移動
			Zspeed=( Thit1.collider.tag == Tags.player && Thit2.collider.tag != Tags.player)? 0 : speed ;
			//線1看見玩家,線2沒看見玩家 = z軸0速,其餘情況 z軸全速
		}else{
			tarpos = player1.position + CamoffsetPlayer;
			Zspeed = speed;
		}

		CamV3.x = Mathf.Lerp(transform.position.x,tarpos.x,Time.fixedDeltaTime*speed);
		CamV3.y = Mathf.Lerp(transform.position.y,tarpos.y,Time.fixedDeltaTime*speed);		
		CamV3.z = Mathf.Lerp(transform.position.z,tarpos.z,Time.fixedDeltaTime*Zspeed);
		transform.position= CamV3;
		//相機進行差值跟隨
		transform.LookAt(player1.position);
		//注視主角
		
	}

返回目錄

5.自動尋路NavMeshAgent

1、Agent Size 物體尺寸控制 
 Radius 物體的半徑 
 Height 物體的高度 
 Base Offset 物體的上下偏移 
2、Steering 行動控制 
 Spped 物體移動的最大速度 
 Angular Speed 物體轉向時的角速度 
 Acceleration 物體移動的加速度 
 Stopping Distance 距離目標點值小於設定值的時候停止 
 Auto Braking 選中會自動停止,不選中會一直前後平滑移動。 
3、Obstacle Avoidance 躲避障礙 
4、Path Finding 路徑查詢 
 Auto Traverse Off Mesh Link:不選中遇到Off Mesh Link點會停止,選中直接路過。 
 Auto Repath:在行走過程中被中斷是否重新開始尋路,比如有門,等門開啟繼續進去。 
 Auto Mask 規定網格行走的區域。

 

float NavMeshAgent.remainingDistance;
//在當前路徑上代理的位置與目的地之間的距離。(只讀) 
navAgent.destination =new Vector3(0,0,0);
//導航位置設定

 

NavMeshAgent.updatePosition = false;//停止對位置的影響
NavMeshAgent.updateRotation = false;//停止對旋轉的影響
NavMeshAgent.Warp(transform.position);//設定代理位置
NavMeshAgent.velocity;//NavMeshAgent 元件的當前速度,或手動設定速度
NavMeshAgent.Stop();//停止導航
NavMeshAgent.Resume();//恢復導航
NavMeshPath path = new NavMeshPath();//新路徑獲得
NavMeshAgent.CalculatePath(playerAnim.transform.position,path);//判斷是否能到達
 float length = 0;
    for (int i = 0;i<path.corners.Length-1;i++){//遍歷節點線段長度計算
        length+=(path.corners[i+1]-path.corners[i]).magnitude;//返回向量的長度	
    }
//path.corners[0]為路徑起點
//path.corners[Length-1]為路徑終點

返回目錄

6.簡單計時器

patrolTimer += Time.deltaTime;//計時

if(patrolTimer>patrolTime){//到達指定時間
    index++;//切換下標
    index%=4;//求餘4,效果:到4為0
    patrolTimer = 0;//計時器清零		
}

返回目錄

7.畫線LineRenderer

lineRenderer.enabled =true;//元件開啟
lineRenderer.SetPosition(0, transform.position+new Vector3(0,1,0));//點1 
lineRenderer.SetPosition(1, pLayerHp.transform.position+new Vector3(0,1,0));//點2

返回目錄