先在场景中放置一连串物体作为角色移动路线的关键点,可以把关键点的触发器Trigger拉得大一些方便角色接触到(如酷跑/赛车类项目可以把关键点的触发器做成拦截整个道路的墙面形状)。让角色从开始位置朝着第一个目标点移动,当角色碰触到第一个目标点的触发器时,更新角色朝向第二个目标点移动,依此类推。

其他实现办法:

  • 使用iTweenPath和iTweenEvent脚本
  • 目前Unity2017版本中,自带的官方案例中有AI按照路线自动运动的场景,之后继续学习看看。
private Transform[] line;   // 场景中的一个个关键点,用于组成行动路线
private int pointIndex = ; // 当前移动到了路线line上的第几个关键点
private Transform m_transform; private Vector3 HTagetPos; // 目标物体在player水平方向的坐标
private Vector3 NextPoint; // 当前路线点到下个路线点的方向
private Vector3 LookDirection; // 自身到目标的方向
private Quaternion targetlook; void Start () {
m_transform = transform;
HTagetPos= line[pointIndex].position;
HTagetPos.y = m_transform.position.y;
NextPoint= (line [pointIndex + ].position - line [pointIndex].position).normalized; // 指向下一个关键点的单位向量
} void Update() {
if (!gameManager.Pause) // 游戏是否暂停
{
moveforward();
} } // 角色向前移动
void moveforward(){
nextpoint();
LookDirection = HTagetPos - m_transform.position;
targetlook = Quaternion.LookRotation (LookDirection); m_transform.Translate (Vector3.forward * Time.deltaTime * speed); // 角色向目标点移动
m_transform.rotation = Quaternion.Slerp(m_transform.rotation, targetlook, Time.deltaTime * speed); // 角色朝向目标点
} // 额外加个判定,用来防止速度太快OnTriggerEnter不起作用的情况出现
// 或者把角色身上的Rigidbody的碰撞检测由默认离散的改为连续的(Continuous)
void nextpoint(){
if (pointIndex + < line.Length) {
if(Vector3.Dot(DirPointNext,m_transform.forward) < 0.2f){
pointIndex++;
HTagetPos= line[pointIndex].position;
HTagetPos.y = m_transform.position.y;
if (pointIndex + < line.Length)
{
NextPoint= (line[pointIndex + ].position - line[pointIndex].position).normalized; // 指向下一个关键点的单位向量
}
}
}
} // 角色碰触到关键点的触发器后,更新下一个目标点的位置
void OnTriggerEnter(Collider other){
// 到达当前路线点时,改为下个目标点
if(other.transform == line[pointIndex]){
if (pointIndex < line.Length - )
{
pointIndex++;
HTagetPos = line[pointIndex].position;
HTagetPos.y = m_transform.position.y;
if (pointIndex + < line.Length)
{
NextPoint = (line[pointIndex + ].position - line[pointIndex].position).normalized;
}
}
else
{
gameManager.Pause = true;
gameManager.gameover();
}
}
}

【Unity】角色沿路线移动/朝着目标移动的更多相关文章

  1. unity 角色换装

    unity角色换装的关键是更改角色部位上的物体的SkinnedMeshRenderer组件的属性: 更改mesh:mesh决定了部位的物体的外形,是主要的数据. 刷新骨骼:同一个部位下,不同的mesh ...

  2. 【Unity笔记】摄像机跟随目标角色

    public class CameraFollow : MonoBehaviour { public Transform target; // The position that that camer ...

  3. Unity 角色场景传送功能

    传送触发器 using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine. ...

  4. Unity 角色复活和重新开始游戏

    作者写游戏完成的时候,还需要从新想下如何把游戏设置重新开始,角色如何复活. 一般大多数都会采用这种方式来代替游戏重新开始 Application.LoadLevel("xxx场景" ...

  5. Unity 角色移动贴墙行走

    直接贴上代码,旋转角色角度检测碰撞 Vector2 v2Normal = new Vector2(normal.x, normal.y); float fAngle = Vector2.SignedA ...

  6. Unity角色对话

    对话类------------------------------------------------------------------------------------------------- ...

  7. unity 角色旋转

    using UnityEngine; using System.Collections; public class Triangle : MonoBehaviour { public float sp ...

  8. Unity角色残影特效

    残影特效在网上有很多例子,比如这个,我参考着自己整合了一下,算是整合了一个比较完整且特别简单易用的出来,只需要一个脚本挂上去无需任何设定就能用. 这里只针对SkinnedMeshRenderer的网格 ...

  9. Unity中差乘判断目标是否在左边或右边

    使用差乘判断左右一般是比较差乘的y,小于0是左,大于0是右.特殊情况可以用其他分量来比较 默认情况: var cross = Vector3.Cross(lhsObject.transform.pos ...

随机推荐

  1. Java 打印程序设计实例

    3.1 打印文本 3.1.1 应用场景 假设我们需要打印一个窗体的某个文本编辑域(可能只有几行,也可能包含多页)的内容,并且每页最多打印 54 行,如何实现呢? 3.1.2 解决方法 基本思路如下:首 ...

  2. django -- 联合索引

    一.定义: from django.db import models # Create your models here. class Person(models.Model): first_name ...

  3. Koa 框架 的错误处理

    默认情况下Koa会将所有错误信息输出到 stderr,除非 NODE_ENV 是 "test".为了实现自定义错误处理逻辑(比如 centralized logging),您可以添 ...

  4. win2016安装postgresql安装不了的问题

    我在阿里云的win2016服务器上下载postgresql,结果怎么都装不上. 双击 Exe没有 任何 反映 .. ... 网上搜索不出..在N个群里问 ,终于碰到有人和我一样的问题了..原来是阿里云 ...

  5. java.util.Date和java.sql.Date 一点区别

    最近无意中发现,在oracle中同一样的一个Date类型字段,存储的日期格式有两种不同的情况,第一种是2011-1-1 12:00:00,第二种是2011-1-1,仔细查找发现在向数据库中写数据的时候 ...

  6. [Windows Azure] Walkthrough to Configure System Center Management Pack for Windows Azure Fabric Preview for SCOM 2012 SP1 (with a MetricsHub Bonus)

    The wait is finally over. This is a huge update to the Azure Management Pack over the one that was r ...

  7. 每天一个linux命令(4) df命令

    linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式: df [选项] [文件] 2.命 ...

  8. linux命令(36):vimdiff文件对比

    启动方法 首先保证系统中的diff命令是可用的.Vim的diff模式是依赖于diff命令的.Vimdiff的基本用法就是: # vimdiff FILE_LEFT FILE_RIGHT 或者 # vi ...

  9. C# 类型实例化的语法糖--unity下诡异结果

    类型实例化语法糖就是如下的用法: public class Abc { public int ID { get; set; } public string Name { get; set; } pub ...

  10. 【ARM】2410裸机系列-中断处理

    目的 为了更好地掌握S3C2410中断的原理及中断程序的编写. 内容利用S3C2410的外部中断0和外部中断1实现两个按键功能 原理 本次选择的是外部中断EXTINT0和EXTINT11.中断的产生分 ...