最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Unity實(shí)現(xiàn)主角移動(dòng)與攝像機(jī)跟隨

 更新時(shí)間:2021年03月11日 08:11:19   作者:雙魚-布衣  
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)主角移動(dòng)與攝像機(jī)跟隨,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

在游戲開發(fā)中,主角需要通過跑地圖來通關(guān)升級(jí),本章主要介紹主角的移動(dòng)和攝像跟隨的操作。

主角移動(dòng)

角色位移通過主角的骨骼動(dòng)畫控制(后續(xù)文章會(huì)詳細(xì)介紹狀態(tài)機(jī)的使用),這里只需要勾選Animator動(dòng)畫控制器下Apply Root Motion讓角色的移動(dòng)受動(dòng)畫控制。

通過碰撞檢測來判斷哪些位置主角可以移動(dòng),哪些位置角色不能行走,這里需要兩個(gè)組件Rigidbody剛體,和Collider碰撞組件

  • Rigidbody:為游戲賦予物理屬性,在游戲中只有添加了剛體的物體才能模擬物理屬性,如重力等。

如上圖所示,各參數(shù)含義如下:

Mass 質(zhì)量:單位任意。但是官方建議物體的質(zhì)量差不要超過100倍
Drag 阻力:物體移動(dòng)時(shí)受到的空氣阻力,0表示無阻力
Angular Drag 角阻力:當(dāng)受扭力時(shí)物體旋轉(zhuǎn)時(shí)受到的空氣阻力,同樣0表示無阻力
Use Gravity 使用重力:表示該物體是否受重力影響
Is Kinematic 是否是運(yùn)動(dòng)學(xué):游戲?qū)ο笫欠褡裱\(yùn)動(dòng)學(xué)規(guī)律,如果激活不在受物理引擎驅(qū)動(dòng)(動(dòng)畫控制移動(dòng),不勾選)
Interpolate 插值:物體運(yùn)動(dòng)的插值模式
Collision Detection 碰撞檢測:碰撞檢測模式。用于避免高速物體穿過其它物體未發(fā)生碰撞
Constraint 約束:對(duì)剛體運(yùn)動(dòng)的約束,可以鎖定位置和旋轉(zhuǎn)的x、y、z軸

  • Collider:碰撞器有很多中,需要根據(jù)實(shí)際的需要選擇不同的觸發(fā)器,這里只是簡單的介紹其基礎(chǔ)功能

Is Trigger 觸發(fā)器:勾選該選項(xiàng),碰撞用于觸發(fā)事件 OnTriggerEnter、OnTriggerExit、OnTriggerStay并被物理引擎所忽略

Input.GetAxis(args) :獲取移動(dòng)方位。

float h = Input.GetAxis("Horizontal");//對(duì)應(yīng)鍵盤的上下
float v = Input.GetAxis("Vertical");//對(duì)應(yīng)鍵盤的左右

通過插值運(yùn)算,控制主角平滑的轉(zhuǎn)向和移動(dòng):

void Update()
{
 role.SetBool(StealthConst.SNEAK, Input.GetKey(KeyCode.LeftShift));
 float h = Input.GetAxis("Horizontal");
 float v = Input.GetAxis("Vertical");
 if (Mathf.Abs(h) > 0.1f || Mathf.Abs(v) > 0.1f)
 {
 //5.6由動(dòng)畫控制器中的參數(shù)決定
 float currentSpeed = Mathf.Lerp(role.GetFloat(StealthConst.SPEED), 5.6f, moveSpeed * Time.deltaTime);
 role.SetFloat(StealthConst.SPEED, currentSpeed);//Animator通過速度控制移動(dòng)的快慢
 Vector3 targetDir = new Vector3(h, 0, v);
 //Vector3.up相當(dāng)于(0,1,0)繞著Y軸,看向目標(biāo)位置
 Quaternion newRotation = Quaternion.LookRotation(targetDir, Vector3.up);
 transform.rotation = Quaternion.Lerp(transform.rotation, newRotation, rotateSpeed * Time.deltaTime);
 }
 else
 {
 role.SetFloat(StealthConst.SPEED, 0);
 }
}

攝像機(jī)跟隨

攝像機(jī)跟隨的原理十分簡單,在場景設(shè)計(jì)中將相機(jī)和主角的相對(duì)位置保持固定,跟隨主角移動(dòng)即可。但是有種特殊情況,當(dāng)主角移動(dòng)到墻邊,被遮擋后如果還是保持原來的相對(duì)位置,則視野中將觀察不到主角,這時(shí)需要?jiǎng)討B(tài)的調(diào)整攝像機(jī)的位置。

這里將采用射線碰撞的方式來檢查,從相機(jī)的位置開始,到主角正上方截止,平均劃分3個(gè)點(diǎn),依次從五個(gè)點(diǎn)分別發(fā)射一條射線,當(dāng)射線能直接碰到主角或者沒有碰到說明主角在攝像的范圍內(nèi),將攝像機(jī)平滑的移動(dòng)到能夠看到主角的位置即可。

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

public class FollowPlayer : MonoBehaviour
{
 private Vector3 offset;
 public Transform role;
 public float moveSpeed = 3;
 public float rotateSpeed = 3;
 
 // Start is called before the first frame update
 void Start()
 {
 offset = transform.position - role.position;
 offset = new Vector3(0, offset.y, offset.z);
 }

 // Update is called once per frame
 void Update()
 {
 Vector3 beginPos = role.position + offset;//攝像機(jī)正常偏移位置,起點(diǎn)
 Vector3 endPos = role.position + offset.magnitude * Vector3.up;//offset.magnitude向量的長度
 ///從起點(diǎn)到終點(diǎn)分別取3個(gè)點(diǎn),通過射線判斷攝像機(jī)是否有遮擋
 Vector3[] posArr = new Vector3[] {
  beginPos,
  Vector3.Lerp(beginPos,endPos,0.25f),
  Vector3.Lerp(beginPos,endPos,0.5f),
  Vector3.Lerp(beginPos,endPos,0.75f),
  endPos
 };
 Vector3 targetPos = posArr[0];
 foreach (var pos in posArr)
 {
  RaycastHit hitInfo;
  ///第一個(gè)參數(shù)射線的起點(diǎn),第二個(gè)參數(shù)射線的方向
  if (Physics.Raycast(pos, role.position - pos, out hitInfo))
  {
  if (hitInfo.collider.tag == StealthConst.PLAYER)
  {
   targetPos = pos;
   break;
  }
  else
  {
   continue;
  }
  }
  else
  {
  targetPos = pos;
  break;
  }
 }
 this.transform.position = Vector3.Lerp(transform.position,targetPos,Time.deltaTime*moveSpeed);//通過插值平滑移動(dòng)
 Quaternion nowRotation = transform.rotation;
 this.transform.LookAt(role.position);//攝像機(jī)轉(zhuǎn)向目標(biāo)
 this.transform.rotation = Quaternion.Lerp(nowRotation, transform.rotation, Time.deltaTime * rotateSpeed);//通過插曲平滑旋轉(zhuǎn)
 }
}

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解C#操作XML的方法總結(jié)

    詳解C#操作XML的方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了C#對(duì)XML文件進(jìn)行一些基本操作的方法,譬如:生成xml文件、修改xml文件的節(jié)點(diǎn)信息等,需要的可以參考一下
    2022-11-11
  • 深入多線程之:深入分析Interlocked

    深入多線程之:深入分析Interlocked

    本篇文章是對(duì)Interlocked進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#基于委托實(shí)現(xiàn)多線程之間操作的方法

    C#基于委托實(shí)現(xiàn)多線程之間操作的方法

    這篇文章主要介紹了C#基于委托實(shí)現(xiàn)多線程之間操作的方法,實(shí)例分析了C#的委托機(jī)制與多線程交互操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • C#多線程的相關(guān)操作講解

    C#多線程的相關(guān)操作講解

    本文詳細(xì)講解了C#多線程的相關(guān)操作,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • c#多線程之間的排他鎖的實(shí)現(xiàn)

    c#多線程之間的排他鎖的實(shí)現(xiàn)

    我們很多時(shí)候會(huì)碰到這樣的問題,使用多線程刷一個(gè)表的數(shù)據(jù)時(shí)需要多個(gè)線程不能重復(fù)提取數(shù)據(jù),那么這個(gè)時(shí)候就需要使用到線程的排他鎖了,本文就詳細(xì)的介紹一下
    2021-08-08
  • C# WPF實(shí)現(xiàn)的語音播放自定義控件

    C# WPF實(shí)現(xiàn)的語音播放自定義控件

    這篇文章主要介紹了C# WPF實(shí)現(xiàn)的語音播放自定義控件,幫助大家更好的理解和學(xué)習(xí)使用c# WPF技術(shù),感興趣的朋友可以了解下
    2021-04-04
  • unity將圖片轉(zhuǎn)換成字體的方法

    unity將圖片轉(zhuǎn)換成字體的方法

    這篇文章主要為大家詳細(xì)介紹了unity將圖片轉(zhuǎn)換成字體的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C# BinaryReader實(shí)現(xiàn)讀取二進(jìn)制文件

    C# BinaryReader實(shí)現(xiàn)讀取二進(jìn)制文件

    在 C# 以二進(jìn)制形式讀取數(shù)據(jù)時(shí)使用的是 BinaryReader 類。本文介紹了C# BinaryReader實(shí)現(xiàn)讀取二進(jìn)制文件,感興趣的可以了解一下
    2021-06-06
  • C#開發(fā)教程之FTP上傳下載功能詳解

    C#開發(fā)教程之FTP上傳下載功能詳解

    這篇文章主要為大家詳細(xì)介紹了C#開發(fā)教程之FTP上傳下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • C#中幾個(gè)未知的Visual Studio編碼技巧分享

    C#中幾個(gè)未知的Visual Studio編碼技巧分享

    用了多年的Visual Studio,今天才發(fā)現(xiàn)這個(gè)編碼技巧,真是慚愧,分享出來,算是拋磚引玉吧,需要的朋友可以參考下
    2012-11-11

最新評(píng)論

兴和县| 上林县| 株洲县| 大连市| 德清县| 登封市| 钦州市| 商洛市| 志丹县| 肥东县| 黄平县| 蓬安县| 福鼎市| 凤阳县| 偏关县| 陆良县| 门源| 长海县| 丰原市| 九寨沟县| 泗阳县| 常州市| 唐山市| 蓝山县| 阿尔山市| 宁陕县| 平阴县| 沈阳市| 陇南市| 合山市| 民和| 德庆县| 石河子市| 留坝县| 开化县| 赞皇县| 伊金霍洛旗| 普兰县| 盐山县| 三台县| 萨迦县|