step Height//能上去d高度差
step Height//能上去d高度差
vs2010和unity的 联调
vs的常用设置都在工具->选项中
build/settings 发布的时候可以用作调试的Developments Build和script Debugging
#案例:主角的移动
属性:
private Transform player;
start():
player = GameObject.Find("Player").transform;
#加断点 点击附加到unity中
#屏幕坐标和世界坐标的映射
创建一个plane 位置(0,0,0)
旋转 -90,0,0
监视鼠标的按下和抬起
void update(){
if(Input.GetMouseButtonDown(1)){
}
if(Input.GetMouseButtonDown(0))
{
}
}
创建一个空物体
命名 mspaint 挂同名脚本
--------
#属性 2个 颜色和大小
private Color paintColor = Color.red;
private float painSize = 0.1f;
#start方法和update方法先删除掉
on value change事件可以来注测变化
#region 收缩代码 看起来公整
#endregion
#设置大小
0.1/0.2/0.4
修改color而不是tinecolour
#ui->canvas
->toggle
->(label)red()
->(label)blue()
->(label)green()
上述三个打包成组(空物体 toggle group)
IS ON
on value changed 检测值的改变
1.color group添加toggle group的组件才可以设置成单选。
而且在每个小组件内部也同样需要添加 赋值为一组的
???为啥我的勾选了就褪色了?
右键一个空物体
在空物体上挂在line_rander
#lineRander
transform 没啥用
#颜色的设置方式
#角落的顶点处 corner
#两边的顶点处 emd cap
#line render的材质
#修改颜色 是材质的问题 有的材质不支持
材质选择spirit 的 defult
有些材质和颜色不支持
利用NavMeshAgent来计算最短路径,运动过程、移动控制我们自定义。
using UnityEngine;
using UnityEngine.AI;
public class Player : MonoBehaviour
{
public float rotateSmoothing = 7.0f;
public float speed = 4.0f;
private NavMeshAgent agent;
void Start()
{
agent = GetComponent<NavMeshAgent>();
//禁用NavMeshAgent的控制位置和控制旋转。
agent.updatePosition = false;
agent.updateRotation = false;
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
agent.nextPosition = transform.position;
agent.SetDestination(hit.point);
}
}
//模拟位置和Player的位置保持一致。
//agent.nextPosition = transform.position;
Move();
}
private void Move()
{
if (agent.remainingDistance < 0.5f) return; //remainingDistance 目标位置与当前位置剩余的距离。
agent.nextPosition = transform.position;
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(agent.desiredVelocity), rotateSmoothing * Time.deltaTime); //desiredVelocity 期望速度,就是最短路径的方向。
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
}
//禁用NavMeshAgent的控制位置和控制旋转。
agent.updatePosition = false;
agent.updateRotation = false;
禁用updatePosition和updateRotation后,,鼠标左键点击地面Evn,绿圆柱体出来了,叫模拟位置。根据这个来计算最短路径。
//模拟位置和Player的位置保持一致。 agent.nextPosition = transform.position;
//模拟位置和Player的位置保持一致。(点击后没有绿框圆柱体跑出去)
using UnityEngine;
using UnityEngine.AI;
public class PlaceBuilder : MonoBehaviour
{
public GameObject builderPrefab;
private NavMeshSurface surface;
void Start()
{
surface = GetComponent<NavMeshSurface>();
}
void Update()
{
if (Input.GetMouseButtonDown(1))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
GameObject go = GameObject.Instantiate(builderPrefab, hit.point, Quaternion.identity);
go.transform.parent = this.transform;
surface.BuildNavMesh();
}
}
}
}
报错原因:Agent Type 不一致。Humanoid和Robot
Player上的NavMeshAgent组件和Env上的NavMeshSurface组件上的,Agent Type需要一致。
Collect Objects:All:场景中的所有物体都会生产NavMesh
Collect Objects:Volume 体积
体积内才会生成NavMesh。
Volume体积,体积内才会生成NavMesh,点击Bake后的效果。
Collect Objects : Children,为孩子和当前挂在组件的物体一起生成NavMesh。
使用NavMeshSurface生成导航网格,不考虑是否是静态的【Navigation Static】。
Include Layers:通过不同的层来区分是否要进行生成导航网格。
Use Geometry:使用几何形状。
Render Meshes(渲染网格)来生成。看得见就会生成导航网格,看不见就不会生成导航网格。
Physics Colliders(物理碰撞器)来生成,有碰撞器就会生成导航网格。
Advanced 高级:
Runtime NavMesh Build (运行时构建导航网格)
NavMeshBuildingComponent文件ZIP包:
https://github.com/Unity-Technologies/NavMeshComponents
需要导入:NavMeshComponent.zip压缩包中Asset文件下的文件到项目
①给游戏物体添加NavMeshSurface组件。
②Open Agent Settings 打开代理设置,添加Humanoid设置,点击 + 号,修改名字为Robot。修改Radius半径为0.1,Height高度为1。
③回到NavMeshSurface组件上,修改Agent Type为刚刚创建的Robot。
④点击Bake
①在任何一个物体上添加OffMeshLink的组件。
②需要指定Start和End的位置。
灰色的链接,链接不可用。上面的End找到了附近的NavMesh,下面的Start的节点没有找到附近的NavMesh。
链接是双向的。
Cost Override 时间花费,没有花费,和Naviagtion---Area---Cost一样的。
Bi Directional 勾选就是双向的箭头链接,取消勾选就是单向的箭头链接,从Start到End的方向。
不可用,链接的颜色显示橙色的。
Activated 取消勾选就是这个链接不可用。
Auto Update Positon,自动更新位置,当Start和End位置发生改变,链接也会跟着改变。
Navigation Area,导航网格的区域。可行走的、
给障碍物添加NavMeshObstacle组件。游戏中出现变化的物体。
勾选Carve,防止NavMeshAgent在走最短路径和障碍物NavMeshObstacle,阻挡了最短路径一致卡这个位置,到达不了目标点Target。而且会障碍物NavMeshObstacle移动会重新生成导航网格
勾选Carve会重新生成导航网格。
一直运动的物体,不建议勾选Carve,重新生成导航网格,十分消耗性能。因为会让开这条路的。
勾选Carve,的物体适用于不经常移动的物体。
不勾选Carve不会对导航网格造成影响。
勾选Carve会影响导航网格。
Drop Height:跳下高度。
①、设置Drop Height,跳下高度
②、Navigation---Object---Generate OffMeshLinks 打勾(Generate OffMeshLinks 断开的导航网格)
③点击Bake
Jump Distance:跳跃距离,跳多远。
①、设置Jump Distance 跳跃距离;
②、设置Generated off Meshs打勾;
③、点击bake
Align With View 设置成 与当前视口一致。
using UnityEngine;
using UnityEngine.AI;
public class Player : MonoBehaviour
{
private NavMeshAgent agent;
void Start()
{
agent = GetComponent<NavMeshAgent>();
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
agent.SetDestination(hit.point);
}
}
}
}
NavMeshAgent和Navigation属性一致。
主要取决于导航网格的设置。
Areas:区域
Object下的Navigation Area:
Walkable、Not Walkable、Jump
Not Walkable,不可行走;门上面不需要行走,可以设置成不可行走。Not Walkable。
Cost 花费,代价
若是距离近,代价高,不会走这条路
①、给Player添加NavMeshAgent组件
②、Player的绿圆柱体的框,是由于NavMeshAgent决定的,决定Player所占用的空间大小
运行不会动,因为我们还没有给它目标。指定Icon。
③、需要设置NavMeshAgent的目标位置才会移动。
using UnityEngine;
using UnityEngine.AI;
public class Player : MonoBehaviour
{
public Transform target;
private NavMeshAgent agent;
void Start()
{
agent = GetComponent<NavMeshAgent>();
agent.destination = target.position;
}
void Update()
{
}
}
Speed:速度
Angular Speed:旋转速度
Acceleration:加速度,包含旋转的加速度
Stopping Distance:停止距离,到达距离目标位置多近停止移动。0是达到目标位置停止。
Auto Braking 取消勾选有减速效果,来回移动是因为减速效果超过了然后又要回来,回来又超过了,接着。勾选上了会到达目标位置停止移动。
Agent Radius :Agent的半径,边界距离:
Agent Height:Agent 高度
Agent Height 可以通过的高度
Agent的高度是2米,图中高度小于2米,不能通过,所以不会生成Navigation路径
为什么没有生成Navigation路径,有可能是宽度小于1,因为Agent的半径是0.5,直径是1,第二种肯能是坡度大于45度,Agent的爬坡能力是最大是45度。
改小Agent Radius,Navigation的边界缩小,
Max Slope 最大坡度,只能爬小于45度的坡
Step Height :台阶高度,小于0.4就能爬上去,生成Navigation。一步蹬多高
【斜坡大于45度】这里的一点Navigation取决于Step Height的设置,可以走这么高。
选中物体,Windows--AI---Navigation,设置为静态的Navigation Static,点击back烘焙