unity3d 转向某一个点_unity3d 速度转向 - CSDN
  • Unity 使物体朝向某个方位

    千次阅读 2018-11-14 20:46:28
    思路 核心是利用transform.lookAt这API Vector3 tar = target.Position; tar.y = transform.position.y; transform.lookAt(tar);

    思路

    • 核心是利用transform.lookAt这个API
    Vector3  tar = target.Position;
    tar.y = transform.position.y;
    transform.lookAt(tar);
    
    展开全文
  • Unity3D 导航系统

    2020-07-03 21:37:58
    打开导航页面 Window ==》Navigation Agents 可以设置多种导航类型 AgentTypes:设置不同的导航者...通过不同区域的导航消费值的高低来计算那条导航路径消费最低 Bake Agent Radius:代理半径,地图宽度大于2倍半

    打开导航页面

    Window ==》Navigation
    在这里插入图片描述

    Agents 可以设置多种导航类型

    在这里插入图片描述
    AgentTypes:设置不同的导航者类型
    Name:导航者的名字
    Radius:导航碰撞体的半径
    Height:导航碰撞体的高度
    SetpHeight:导航者的脚步高度
    MaxSlope:导航者爬坡的最大坡度

    Areas

    在这里插入图片描述
    对导航设置不同的区域
    Name:区域名称
    Cost:导航消费值
    通过不同区域的导航消费值的高低来计算那一条导航路径消费最低

    Bake

    导航前需要先烘焙导航网格
    在这里插入图片描述
    Agent Radius:代理半径,地图宽度大于2倍半径的道路才可以通过。
    Agent Height:导航高度,导航代理能通过的最低高度
    Max Slope:最大斜坡角度,导航代理最大能爬上的斜坡角度
    Step Height:脚步高度,导航代理能通过的最大台阶高度
    Drop Height:跳下高度,导航代理能跳下的最大高度
    Jump Distance:跳跃距离,导航代理能跳过得最大距离
    Manual voxel size :是否可以改变烘焙操作过程中的精确性
    Voxel Size:体素大小,默认的体素设置最好的权衡了准确性和烘焙速度。
    Min Region Area:允许你剔除掉小的非连接NavMesh区域,当NavMesh区域小于指定值时将被剔除
    Height mesh :允许你为角色提供更精准的位置
    Clear:清除导航网格
    Bake:将设置烘焙成网格

    Object

    在这里插入图片描述
    ALL:所有对象 Mesh Renderers:带此组件的对象 Terrains:地形对象
    Navigation Static :上面说了只有选中了Navigation Static之后才能进行网格导航。
    Generate OffMeshLinkes:处于勾选状态的话,网格导航可以Jump和Drop。
    Navigation Area:导航网格层

    导航组件

    在进行添加组件前,先将地形中不能移动的障碍物将Navigation Static勾选上
    在这里插入图片描述
    Static:
    Nothing:没有任何属性;
    Everyting:所有的都是静态的,Unity可以优化;
    LightMap Static:光照阴影是固定不变的;
    Occluder Static: 遮挡静态
    Batching Static:静态批处理
    Navigation Static:导航静态
    Occludee Static:被遮挡静态
    Off Mesh Link Generation:连接两个不连续的区域,在导航时可以在两个点进行跳跃
    Reflection Probe Static:反射

    Nav Mesh Agent 寻路组件

    在这里插入图片描述
    Agent Type:代理类型,选择导航类型
    base offset : 导航碰撞体底部和挂载该组件的物体中心点的偏移

    Speed:最大移动速度
    Angular Speed :最大转向速度
    Acceleration :最大加速度
    Stopping distance:最后停留点与目标点的距离
    Auto Braking:是否自动刹车,如果勾选在达到目标点之前会慢慢减速至0

    Radius:导航组件的半径
    Height:导航组件的高度
    Quality:躲避障碍物的精确度,越高耗能越大
    Priority:0-99之间,两个导航者在一起时,低的先走,高的避开

    Auto Traverse OffMesh Link:导航者到达导航跳跃点,是否自动越过起点到终点
    Auto Repath:是否自动再次定位,导航者不能达到目标点时停留在某一处,如果突然有一条路能达到目标点,这个时候如果这个开启则会重新寻路,否则不会
    Area Mask:规定导航着可以行走的区域,自己可以定义不同的导航网格,在烘焙导航网格的时候

    Off-Mesh Link 跳跃

    在这里插入图片描述
    Start:跳跃的起点
    End:跳跃的终点
    Cost Override:成本覆盖,值为正,则在路径请求处理中计算路径成本时使用该属性,否则,我们使用默认成本
    BiDirectional:双向开关,若不勾选则只能从Start到End跳跃
    Activated:导航是否可以使用该跳跃路径
    Auto Update Positions:勾选则自动完成跳跃,不勾选则可通过代码实现跳跃
    Navigation Area:设置导航区域

    Nav Mesh Obstacle 动态路障

    在这里插入图片描述
    Shape:选择形状,有Box和Capsule两种类型
    Center:形状的位置
    Size:形状的大小
    Carve:选中后导航体会自动换路,不会在一个树上吊死(有其他路的话)

    • Move Threshold:超过这个值导航体才会重新生成网格
    • Time To Stationary:超过这个值的时间才会开始生成网格
    • Carve Only Stationary:是否实时生成网格

    导航类

    NavMeshAgent

    字段

    名称 作用
    acceleration 最大加速度,面板上的辣锅
    agentTypeID 导航区域的ID
    angularSpeed 最大转向速度
    areaMask 指定哪一个NavMesh区域是可用的
    autoBraking 自动刹车,避免超过目的地点
    autoRepath 自动重新获取路径
    autoTraverseOffMeshLink 自动穿过Off Mesh Link(上面有介绍)
    avoidancePriority 当代理是一个障碍物时,级别低的代理被忽视
    baseOffset 基础偏移
    currentOffMeshLinkData 当前分离路⾯导航的数据,有字段:activated:是否处于激活状态 startPos:分离路⾯起点 endPos:分离路⾯终点 offMeshLink:是否是手动放置的 valid:链接是否有效 linkType:LinkTypeManual:使⽤OffMeshLink组件完成分离路⾯导航 LinkTypeDropDown:跳下⽅式 LinkTypeJumpAcross:⽔平跳跃⽅式
    desiredVelocity 期望速度
    destination 获取或设置目的地
    hasPath 当前是否有路径到达目的地
    height 可以通过的高度
    isOnNavMesh 该代理当前绑定到导航网格吗
    isOnOffMeshLink 代理当前的位置在一个OffMeshLink上吗
    isPathStale 当前路径是否陈旧
    isStopped 是否开始/停止导航
    navMeshOwner 返回代理当前所在的NavMesh的拥有对象
    nextOffMeshLinkData 当前路径的下一个OffMeshLinkData
    nextPosition 下一步应该走的位置
    obstacleAvoidanceType 规避质量的水平,上图有,就是修改Quality
    path 设置或者获取当前路径,返回的是NavMeshPath类型,有字段corners:路径的拐点 status:路径的状态(到达目标,中途到达目标或完全无效) 和方法ClearCorners:从路径中删除所有拐角点 GetCornersNonAlloc:计算路径的拐角
    pathPending 进程中的路径正在被计算但是还没转备好,bool值
    pathStatus 返回的是NavMeshPathStatus类型,当前路径的状态(PathComplete:完成,PathPartial:局部或PathInvalid:无效)
    radius 代理的避让半径,如上图的Radius
    remainingDistance 在当前路径中,代理的位置和目标位置的距离,如果这个距离是未知的那么这个值是infinity
    speed 在一条路径上行走时的最大移动速率
    steeringTarget 获得路径上的当前转向点
    stoppingDistance 当距离目标位置这个距离的时候停止,如上图Stopping distance
    updatePosition 获取或设置transform position是否与模拟的代理位置同步。默认为true
    updateRotation 代理是否更新方向
    updateUpAxis 允许您指定是将代理对齐到NavMesh的上轴还是将其放置在其上的链接
    velocity 获取NavMeshAgent组件的当前速度,或者手动为代理设置一个速度

    方法

    名称 作用
    ActivateCurrentOffMeshLink(bool activated) 激活当前分离网格链接
    CalculatePath(Vector3 targetPosition, NavMeshPath path) targetPositon 路径要求的重点位置。path 作为结果的路径,如果路径被找到返回true
    CompleteOffMeshLink 结束当前OffMeshLink上的移动,代理会移动到离当前OffMeshLink另一端最近的有效的位置
    FindClosestEdge(out NavMeshHit hit) hit 掌握定位结果的性能返回的NavMeshHit 包含最近的边缘上的最近的点的位置和细节,distance:到击中点的距离 hit:命中时设置标志 mask:在命中点指定 NavMesh:区域的蒙版 normal:(不清楚) position:命中位置。如果最近的边缘被找到返回True
    GetAreaCost(int areaIndex) areaIndex 区域索引,返回指定的区域索引当前的消耗
    Move(Vector3 offset) offset 相对的移动向量,申请一个相对当前位置的移动,如果代理有一个路径他将被校正
    Raycast(Vector3 targetPosition, out NavMeshHit hit) targetPosition 将要移动到的终点 hit 被射线发现的障碍物的属性(如果有) ,如果代理和目标位置之间有障碍物返回True,否则false
    ResetPath 清除当前路径,路径清除之后代理不会寻找一个新的路径直到SetDestination 被调用,如果调用该函数时在OffMeshLink上,则会立即完成
    SamplePathPosition(int areaMask, float maxDistance, out NavMeshHit hit) areaMask 一个位域标志,指定了寻路是哪个区域可以通过 maxDistance 超出这段距离则终止搜索路径 hit 保存结果地理位置的属性 ,如果在maxDistance之前结束返回true,否则false
    SetAreaCost(int areaIndex, float areaCost) areaIndex 区域索引 areaCost 指定的区域的新的消耗,设置穿过某种类型的区域时的消耗,如果你启用或废除代理,那么消耗将会被重置为默认值
    SetDestination(Vector3 target) target 导航到的目标点,如果目标地址请求成功返回True,否则false
    SetPath(NavMeshPath path) path 新的寻路路径,指定一段新路径给代理
    Warp(Vector3 newPosition) 让代理移动到指定的newPosition,之后代理不做任何移动

    AreaMask值

    -1表示全选
    若是挑选部分层,则该值的计算方法为:层编号-1,此值作为2的幂,将所有选定层的值相加
    例如,选定1,3,5,6层AreaMask的值
    2(1-1)+2(3-1)+2(5-1)+2(6-1)=53

    展开全文
  • Unity3D中摄像机跟随方法

    万次阅读 多人点赞 2017-02-14 14:21:53
    1.第种方法 摄像机视角锁死方法,具体做法就是事先调试好视角,然后聚焦,然后用代码事先固定视角,其代码如下: / 挂载对象:主相机 // 功能:相机跟随人物 // 注意:相机只能跟随人物移动,但是如果人物转向...

    1.第一种方法

    摄像机视角锁死方法,具体做法就是事先调试好视角,然后聚焦,然后用代码事先固定视角,其代码如下:

    /  挂载对象:主相机
    // 功能:相机跟随人物
    // 注意:相机只能跟随人物移动,但是如果人物转向或者做某些动作,摄像机并不跟随
    using UnityEngine;
    using System.Collections;
    public class CameraShareScript : MonoBehaviour
    {
            //摄像机于要跟随物体的距离
             Vector3 Dir;
    //要跟随的物体
    public  GameObject m_Player;
    // Use this for initialization
    void Start ()
           {
    //获取到摄像机于要跟随物体之间的距离
    Dir = m_Player.transform.position - transform.position;
    }

    // Update is called once per frame
    void LateUpdate ()
    {
    //摄像机的位置
    transform.position = m_Player.transform.position - Dir;
            }
    }

    优点:代码简单,但是不能跟随人物旋转,运动。

    2.第二种方法:

    这种方法是上种方法的优化,可以实现跟随人物移动,跟随人物旋转等基本功能,但是缺点是如果添加刚体组件,摄像机无法穿墙跟随人物,其代码如下:
    //  挂载对象:主相机
    // 功能:把要跟随的人物Tag修改为Player
    // 注意:
    using UnityEngine;
    using System.Collections;


    public class CameraFindPlayerScript : MonoBehaviour
    {
    //相机距离人物高度
    float m_Height = 5f;
    //相机距离人物距离
    float m_Distance = 5f;
    //相机跟随速度
    float m_Speed = 4f;
    //目标位置
    Vector3 m_TargetPosition;
    //要跟随的人物
    Transform follow;
    // Use this for initialization
    void Start ()
    {
    // 通过Tag得到这个要跟随的人物
    follow = GameObject.FindWithTag ("Player").transform;
    }

    // Update is called once per frame
    //相机平滑的跟随人物移动
    void LateUpdate ()
    {
    //得到这个目标位置
    m_TargetPosition = follow.position + Vector3.up * m_Height - follow.forward * m_Distance;
    //相机位置
    transform.position = Vector3.Lerp (transform.position, m_TargetPosition, m_Speed * Time.deltaTime);
    //相机时刻看着人物
    transform.LookAt (follow);


    }
    }

    基本实现相机时刻跟随人物移动,方便快捷。
    本博客为作者亲力手敲,持续更新,如有雷同,纯属巧合

    3.第三种方法

    第三种方法:射线检测,保证不论主角在哪摄像机永远可以看到主角,并且把摄像机的y轴和z轴锁死,使玩家视野不晕
    using UnityEngine;
    using System.Collections;
    /// <summary>
    /// Camera move.
    /// 挂载对象:摄像机
    /// 作用:摄像机跟随人物
    /// </summary>
    public class CameraMove : MonoBehaviour
    {
    //摄像机的移动速度
    public float moveSpeed = 3f;
    //摄像机的旋转速度
    public  float turnSpeed = 10f;
    //定义私有玩家
    private Transform m_Player;
    //摄像机与玩家之间的初始偏移量
    private Vector3 offset;
    //射线的碰撞信息
    private RaycastHit hit;
    //摄像机与玩家之间的距离
    private float distance;
    //摄像机的观察点
    private Vector3[] currentPoints;
    //通过Awake拿到自身的组件
    void Awake ()
    {
    //通过tag找到人物组件
    m_Player = GameObject.FindWithTag (TagsScript.Player).transform;
    //定义一个v3类型的数组,里面有5个元素
    currentPoints = new Vector3[5];
    }
    //初始化游戏对象
    void Start ()
    {
    //游戏开始时摄像机与玩家之间的距离
    distance = Vector3.Distance (transform.position, m_Player.position);
    //摄像机指向玩家
    //玩家与摄像机之间的偏移量
    offset = m_Player.position - transform.position;
    }


    //物理引擎相关的放到FixedUpdate中
    //LateUpdate可以避免卡顿
    void LateUpdate ()
    {
    //摄像机观察的第一个点
    Vector3 startPosition = m_Player.position - offset;
    //摄像机的最后一个点
    Vector3 endPosition = m_Player.position + Vector3.up * distance;
    //把摄像机的五个观察点放到数组中,并且1,2,3三个观察点使用线性插值让摄像机平滑移动Slerp
    currentPoints [1] = Vector3.Slerp (startPosition, endPosition, 0.25f);
    currentPoints [2] = Vector3.Slerp (startPosition, endPosition, 0.5f);
    currentPoints [3] = Vector3.Slerp (startPosition, endPosition, 0.75f);
    currentPoints [0] = startPosition;
    currentPoints [4] = endPosition;
    //定义一个变量用来存储固定帧可以看到玩家的观察点
    //viewposition = currentPoints [0]
    Vector3 viewposition = currentPoints [0];
    //for循环遍历这些点,如果找到最合适的点就把那个当前点赋值给可以看到玩家的观察点CheckView检测某个点能否看到玩家
    for (int i = 0; i < currentPoints.Length; i++) {
    //如果检测到某个点可以看到玩家
    if (CheckView (currentPoints [i])) {
    //把这个当前点赋值给viewposition
    viewposition = currentPoints [i];
    //之后返回不在继续遍历
    break;
    }
    }
    //把摄像机移动到观察点
    transform.position = Vector3.Lerp (transform.position, viewposition, Time.deltaTime * moveSpeed);
    //调用摄像机旋转方法
    SmoothRotate ();
    }
    /// <summary>
    /// Checks the view.
    /// 检测某个点是否可以看到玩家
    /// </summary>
    /// <returns><c>true</c>, if view was checked, <c>false</c> otherwise.</returns>
    /// <param name="pos">Position.</param>
    //检测某个点能否看到玩家的方法bool类型
    bool CheckView (Vector3 pos)
    {
    //定义玩家与观察点之间的方向向量
    Vector3 dir = m_Player.position - pos;
    //发射射线
    if (Physics.Raycast (pos, dir, out hit)) {
    //如果射线打到玩家
    if (hit.collider.tag == TagsScript.Player) {
    //返回true
    return true;
    }
    }
    //不然返回false
    return false;
    }
    /// <summary>
    /// Smooths the rotate.
    /// 摄像机旋转的方法
    /// </summary>
    /// 摄像机旋转的方法
    void SmoothRotate ()
    {
    //指向起始位置
    //摄像机到玩家的向量
    Vector3 m_Dir = m_Player.position - transform.position;
    //要旋转的角度
    Quaternion qua = Quaternion.LookRotation (m_Dir);
    transform.rotation = Quaternion.Lerp (transform.rotation, qua, Time.deltaTime * turnSpeed);
    //把摄像机x,y轴锁死
    transform.eulerAngles = new Vector3 (transform.eulerAngles.x, 0, 0);

    }
    }

    此种方法的好处非常多,可以检测遮挡物,并且不论人物在哪里都可以看到人物。




    展开全文
  • Unity 物体面朝目标

    2020-07-30 23:32:11
    让被挂载物体一直面朝目标
  • Unity中,要使得物体朝向一个目标向量可以直接用transform.LookAt()实现。  那么有没有什么办法可以在不使用 transform.LookAt() 的前提下,直接计算出物体在调用 transform.LookAt() 后的旋转角度?答案是肯定...

            在Unity中,要使得物体朝向一个目标向量可以直接用transform.LookAt()实现。 

    那么有没有什么办法可以在不使用 transform.LookAt() 的前提下,直接计算出物体在调用 transform.LookAt() 后的旋转角度?答案是肯定的。直接给出代码:


        /// <summary>
        /// 获取物体LookAt后的旋转值
        /// </summary>
        /// <param name="originalObj"></param>
        /// <param name="targetPoint"></param>
        /// <returns></returns>
        public static Vector3 GetLookAtEuler(Transform originalObj,Vector3 targetPoint)
        {
            //计算物体在朝向某个向量后的正前方
            Vector3 forwardDir = targetPoint - originalObj.position;


            //计算朝向这个正前方时的物体四元数值
            Quaternion lookAtRot = Quaternion.LookRotation(forwardDir);


            //把四元数值转换成角度
            Vector3 resultEuler = lookAtRot.eulerAngles;

            return resultEuler;
        }

    展开全文
  • 类似Quaternion.LookRotation的效果(这个函数只能让对象的脸即z轴,面向一个点。不够灵活) 下面这个相对比较灵活: Quaternion q; GameObject obj; //面对的对象,可以只是一个点 q=Quaternion....
  • Unity中绕任意轴任意角度旋转向量

    万次阅读 2017-03-17 00:41:25
    游戏中有一需求,就是一个矩形或者Cube绕着一点旋转任意角度,现在给出下面算法。
  • 如果你在游戏的开发中,想要控制主角的移动却又不想处理刚体的碰撞,那么Unity3D中的角色控制器组件CharacterController就可以满足你的要求了。它包含一些刚体的属性,比如,如果在一个添加了角色控制器组件的对象上...
  • Unity3D的四种坐标系

    2019-12-29 23:06:30
    1.unity3d中的坐标系 1)World Space(世界坐标):标准的D3D左手坐标系,旋转方向是左手法则包括法向量方向,背面剔除逆时针的。我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在transform.position...
  • unity3d--人物朝向(RPG游戏黑暗之光)

    千次阅读 2016-10-16 17:39:37
    控制功能: 鼠标点击地面产生点击效果 ... 则明显需要使用射线检测,用于检测射线与地面的碰撞信息,则脚本如下: public GameObject Click_Effect;...void upDate() { if(Input.GetMouseDown(0)) {
  • 如何自学Unity3d最有效率?本人平面设计师,半插画师。有教熟练的web制作基础,对html和div css非常了解。终极目标是能自己在工作外能当作爱好使用Unity制作有教育意义的小游戏给以后的孩子玩,或者做独立的小...
  • Unity3D官方教程爬坑

    万次阅读 2019-10-17 15:51:04
    同时会添加到处学来的的Unity技巧 ---------------------------------------------------------- 代码: 1.使游戏对象运动的N种方式 更全面的移动方式参考 1、rigidbody.addforce(Vector3 * speed) (见roll...
  • 从2D游戏到3D游戏的进化,最重要的就是游戏视角的控制。奠定了3D游戏操作模式的1998年的神话级游戏《塞尔达传说:时之笛》中,对3D下游戏视角设计的关键即在于“镜头跟随”与“视角锁定”。本文将在unity中实现该...
  • 有的时候我们希望相机可以慢慢的转动去看向一个目标物体,官方的API里有个方法是LookAt,但是LookAt是直接看过去,少了一个旋转的过程。 void CameraRotateToLookAt(Transform target,float rotateSpeed) { ...
  • 2020年Unity3D应届生面试题

    千次阅读 2020-08-31 10:47:02
    基础题 ...在C++中,函数指针不是类型安全的,它指向的是内存中的某一个位置,我们无法判断这个指针实际指向什么,对于参数和返回类型难以知晓。而C#的委托则完全不同,它是类型安全的,我们可以清晰的
  • unity3d中使用状态机

    千次阅读 2016-07-28 14:36:10
    在同一个act根据状态id不同,调用不同的类执行代码。 以一个士兵,有查找敌人、移动、攻击、胜利、自身死亡,这五种状态为例。 FMS_State_ShiBing.cs是状态机的父类。主要完成定义状态枚举和构建状态字段 ...
  • Unity3D 有限状态机()

    千次阅读 2015-11-16 10:43:29
     今天我给大家分享一下,我在这几天制作的一个简单的状态机,希望给大家一些启发! 希望大家可以写出更好的有限状态机!  感谢 softimagewht 的文章帮助 http://www.cnblogs.com/softimagewht/  
  • unity3d 脚本参考-技术文档

    千次阅读 2013-09-04 22:30:22
    unity3d 脚本参考-技术文档  核心提示:一、脚本概览这是一个关于Unity内部脚本如何工作的简单概览。Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的。在脚本对象内部不同志的函数被特定的...
  • 1、通过输入鼠标右键获取光标在屏幕上的坐标信息,if(Input.GetMouseButtonDown(1)){ Vector3 mousePosition...2、将该光标转化为世界坐标//从相机中打出一个经过mousePosition的射线Ray ray=Camera.main.ScreenP...
  • 1.Interactable System: 1.Picture Interactable:Player走到SecurityRoom墙前的那张画   2.Fish Interactable鱼档前的交互   3.Guard Interactable守卫   2.Player 这Phase要实现在......
1 2 3 4 5 ... 12
收藏数 222
精华内容 88
关键字:

unity3d 转向某一个点