亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 編程設計 > 正文

Unity3D 實現怪物巡邏、按路線行走操作

2020-07-14 13:22:46
字體:
來源:轉載
供稿:網友

為了豐富我們的游戲,我們經常會給游戲中的角色(怪物)添加行走路線,本想用 ITweenPath 插件實現,但是一直沒有找到合適的辦法,因為不知道如何實現實行的獲得地形高度,或者如果使用角色控制器移動(CharacterController),怎么使用 ITweenPath 驅動?本人愚笨,自己實現了個(這兒只是使用 ITweenPath 繪制出來的點),也算拋磚引玉,如果讀者知道如何更簡單的實現方式,還請告之!共同進步!

先來看看最終的效果圖:

場景中有兩個角色,然后他們會在 ITweenPath 繪制的線上隨機移動!下面我們先搭建好測試的場景,如下圖:

然后我們使用 ITweenEditor 編輯場景中角色的行進路線,如下圖:

后面,就需要我們自己去實現行走的邏輯了,獲取 ITweenPath 曲線上的點,前面的文章中提到,詳細可以看此鏈接,然后我們新建立一個RoleController.cs 文件,然后編寫我們的代碼,全部代碼如下:


復制代碼
代碼如下:

using UnityEngine;
using System.Collections;
public class RoleController : MonoBehaviour
{
public iTweenPath tweenPath;
/// <summary>
/// 曲線上面點的個數,點數越多移動越平滑
/// </summary>
public int pointSize = 5;
/// <summary>
/// 角色移動速度
/// </summary>
public float speed = 3f;

public AnimationClip walkClip;
public AnimationClip idleClip;
private Vector3[] pathPositionList;
private Vector3 pathPoint;
private Vector3[] positionList;
private Vector3 nextPoint;
private Vector3 direction;
private int moveIndex;
private bool moveStatus;
private bool idleStatus;
private Animation animation;
void Awake()
{
this.pathPositionList = PointController.PointList(tweenPath.nodes.ToArray(), this.pointSize);
this.animation = this.GetComponent<Animation> ();
this.moveIndex = 0;
this.moveStatus = false;
this.idleStatus = false;
if (this.pathPositionList.Length > 0)
{
this.pathPoint = this.pathPositionList [Random.Range(0, this.pathPositionList.Length)];
}
}
void Start()
{
this.transform.position = this.GetTerrainPosition (this.pathPoint);
this.StartCoroutine(this.SetNextPositionList(0));
}
void Update()
{
this.SetMoveDirection ();
this.SetMovePosition ();
}
/// <summary>
/// 設置移動向量
/// </summary>
protected void SetMoveDirection()
{
if (this.positionList == null) return;
if (this.moveIndex < this.positionList.Length)
{
if(!this.moveStatus)
{
this.pathPoint = this.positionList[this.moveIndex];
this.nextPoint = this.GetTerrainPosition(this.pathPoint);
this.direction = (this.nextPoint - this.transform.position).normalized * this.speed;
if(this.direction != Vector3.zero)
{
this.transform.rotation = Quaternion.LookRotation(new Vector3(this.direction.x, 0f, this.direction.z));
this.moveStatus = true;
}else{
this.moveIndex ++;
}
}
}else
{
if(!idleStatus)
{
this.idleStatus = true;
this.animation.CrossFade (this.idleClip.name);
this.StartCoroutine(this.SetNextPositionList(5));
}
}
}
/// <summary>
/// 設置移動位置
/// </summary>
protected void SetMovePosition ()
{
if (this.positionList == null) return;
if (!this.IsArrivePosition ())
{
//this.characterController.Move(this.direction * Time.deltaTime); // 可以取消這句,并且注釋下面那句,可以使用角色控制器進行移動
this.transform.position = GetTerrainPosition(this.transform.position + this.direction * Time.deltaTime);
} else {
this.transform.position = this.nextPoint;
this.moveStatus = false;
this.moveIndex ++;
}
}
protected IEnumerator SetNextPositionList(int sceond)
{
if (sceond > 0)
{
yield return new WaitForSeconds (5);
} else {
yield return null;
}
int index = this.GetIndexByList (this.pathPositionList, this.pathPoint);
if (index != -1)
{
int nextIndex = Random.Range(0, this.pathPositionList.Length);
if(index != nextIndex)
{
int beginIndex = index > nextIndex ? nextIndex : index;
int endIndex = index > nextIndex ? index : nextIndex;
Vector3[] positionList = new Vector3[endIndex - beginIndex];
int positionLength = positionList.Length;
if(index > nextIndex)
{
for(int pathIndex = endIndex, positionIndex = 0; pathIndex >= beginIndex && positionIndex < positionLength; pathIndex --, positionIndex ++)
{
positionList[positionIndex] = this.pathPositionList[pathIndex];
}
}else{
for(int pathIndex = beginIndex, positionIndex = 0; pathIndex <= endIndex && positionIndex < positionLength; pathIndex ++, positionIndex ++)
{
positionList[positionIndex] = this.pathPositionList[pathIndex];
}
}

this.moveIndex = 0;
this.moveStatus = false;
this.idleStatus = false;
this.animation.CrossFade (this.walkClip.name);
this.positionList = positionList;
}
}
}
/// <summary>
/// 獲取點帖地位置
/// </summary>
/// <returns>The terrion position.</returns>
/// <param name="position">Position.</param>
private Vector3 GetTerrainPosition(Vector3 position)
{
Vector3 terrainPosition = new Vector3 (position.x, position.y, position.z);
terrainPosition.y = Terrain.activeTerrain.SampleHeight (terrainPosition);
return terrainPosition;
}
/// <summary>
/// 是否到達指定位置
/// </summary>
/// <returns><c>true</c> if this instance is arrive position; otherwise, <c>false</c>.</returns>
private bool IsArrivePosition()
{
Vector3 currentDirection = (this.nextPoint - (this.transform.position + this.direction * Time.deltaTime)).normalized;
if (this.CalculateNormalized (currentDirection) == this.CalculateNormalized (this.direction) * -1)
{
return true;
}
return false;
}
/// <summary>
/// 計算向量標準
/// </summary>
/// <returns>The normalized.</returns>
/// <param name="data">Data.</param>
private Vector3 CalculateNormalized(Vector3 data)
{
Vector3 position = Vector3.zero;
position.x = data.x >= 0 ? 1 : -1;
position.z = data.z >= 0 ? 1 : -1;
return position;
}
private int GetIndexByList(Vector3[] positionList, Vector3 position)
{
int index = 0;
foreach (Vector3 item in positionList)
{
if(item.x == position.x && item.y == position.y && item.z == position.z) return index;
index ++;
}
return -1;
}
}

然后我們給場景中的角色掛載RoleController.cs 腳本,并且設置好相關屬性,如下圖:

最后運行游戲,就可以看到角色在場景中按線路行走了!

百度網盤下載地址:http://pan.baidu.com/s/1c0EOOnA 密碼: l4d5

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
伊人久久久久久久久久久| 欧美激情第一页xxx| 久久久精品在线观看| 色偷偷亚洲男人天堂| 91精品国产91久久久久福利| 久久国产天堂福利天堂| 一本色道久久综合狠狠躁篇怎么玩| 日av在线播放中文不卡| 亚洲区一区二区| 国产精品三级久久久久久电影| 91精品国产综合久久香蕉922| 性欧美视频videos6一9| 欧美精品videos性欧美| 亚洲免费电影在线观看| 色综久久综合桃花网| 欧美激情亚洲综合一区| 亚洲女人天堂色在线7777| 97精品在线观看| 国产视频999| 亚洲性69xxxbbb| 日韩欧美中文字幕在线观看| 成人疯狂猛交xxx| 91国语精品自产拍在线观看性色| 久久久久国产精品一区| 欧美激情精品久久久久久| 欧美成人激情视频| 亚洲第一精品久久忘忧草社区| 国产精品永久免费视频| 亚洲视频国产视频| 国产欧美一区二区三区四区| 欧美成人性色生活仑片| 欧美精品成人在线| 欧美激情精品久久久久久久变态| 免费av一区二区| 国产日韩中文字幕| 日韩亚洲在线观看| 国产91精品高潮白浆喷水| 亚洲va久久久噜噜噜| 亚洲热线99精品视频| 国产一区二区日韩精品欧美精品| 日韩精品在线免费| 国产精品99导航| 亚洲男人天堂手机在线| 成人春色激情网| 亚洲欧美另类在线观看| 久久综合九色九九| 国产有码一区二区| 欧美国产日韩一区二区三区| 久久夜精品va视频免费观看| 亚洲理论电影网| 97人人爽人人喊人人模波多| 成人免费网站在线| 色无极影院亚洲| 亚洲精品v欧美精品v日韩精品| 亚洲国产美女精品久久久久∴| 欧美一级片在线播放| 欧美成人黑人xx视频免费观看| www国产精品视频| 91豆花精品一区| 欧美激情区在线播放| 一区二区亚洲欧洲国产日韩| 最近2019免费中文字幕视频三| 亚洲理论片在线观看| 国产欧美中文字幕| 在线日韩欧美视频| 欧美精品videosex牲欧美| 日韩视频在线免费观看| 日韩在线观看免费网站| 日韩中文字幕av| 亚洲二区在线播放视频| 一区二区三区视频免费在线观看| 91在线看www| 懂色av中文一区二区三区天美| 国产精品久久久久一区二区| 亚洲精品一区二区网址| 亚洲石原莉奈一区二区在线观看| 97精品一区二区视频在线观看| 国产精品你懂得| 亚洲精品不卡在线| 成人伊人精品色xxxx视频| 精品女厕一区二区三区| 日韩中文字幕网| 国产成人亚洲综合青青| 欧洲美女7788成人免费视频| 久久影院资源网| 国产97在线观看| 久久婷婷国产麻豆91天堂| 91免费观看网站| 欧洲永久精品大片ww免费漫画| 成人高清视频观看www| 性欧美暴力猛交69hd| 色偷偷噜噜噜亚洲男人| 午夜精品久久久久久久99黑人| 欧美二区在线播放| 久久久999成人| 欧美高清电影在线看| 92裸体在线视频网站| 亚洲国产毛片完整版| 91亚洲精品久久久| 国产狼人综合免费视频| 欧美日韩精品在线播放| 欧美大片免费观看| 欧美日韩免费区域视频在线观看| 欧美限制级电影在线观看| 成人性生交大片免费看视频直播| 97在线精品国自产拍中文| 91色p视频在线| 亚洲va久久久噜噜噜| 91成人福利在线| 亚洲精美色品网站| 国语自产精品视频在免费| 亚洲精品福利免费在线观看| 亚洲欧美日韩综合| 亚洲视频欧洲视频| 亚洲精品电影网| 不卡在线观看电视剧完整版| 中文字幕精品www乱入免费视频| 成人在线免费观看视视频| 亚洲人午夜色婷婷| 97在线视频精品| 日韩中文字幕在线播放| 国产z一区二区三区| 亚洲免费av电影| 精品国产一区二区三区久久久狼| 欧美激情中文字幕在线| 欧美xxxx综合视频| 国产精品日日摸夜夜添夜夜av| 国产日本欧美一区二区三区在线| 国产精品偷伦免费视频观看的| 日韩中文字幕久久| 日韩精品视频在线观看免费| 亚洲综合第一页| 欧美电影免费观看高清完整| 亚洲精品电影在线观看| 日本亚洲精品在线观看| 亚洲女人被黑人巨大进入| 久久久亚洲精品视频| 欧美高清视频在线观看| 国产女人精品视频| 欧美大尺度在线观看| 国产99视频在线观看| 日韩精品视频在线播放| 最近中文字幕mv在线一区二区三区四区| 亚洲视频在线免费看| 2024亚洲男人天堂| 欧美一区二区三区艳史| 欧美极品美女视频网站在线观看免费| 68精品国产免费久久久久久婷婷| 亚洲国产精品人久久电影| 中文国产成人精品久久一| 欧美一区二区三区四区在线| 欧美性猛xxx| 国产又爽又黄的激情精品视频| 国产精品女主播视频| 国产在线观看一区二区三区| 国产精品入口夜色视频大尺度| 日韩中文字幕av| 97香蕉超级碰碰久久免费的优势| 91免费在线视频网站| 欧美一二三视频| 欧美成人免费大片| 亚洲美女动态图120秒| 欧美激情按摩在线| 97免费在线视频|