ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【学习笔记】 unity基础_Day12

2021-07-23 21:58:25  阅读:309  来源: 互联网

标签:target void agent unity 烘焙 笔记 Day12 NavMeshAgent animator


一.BlendTree混合树的使用

1.放入一组动画,成为类似的动画片段,相当于一个动画合成器

2.BlendType  

1D 一维模式

2D simple Directional

Animator aniChan;
	// Use this for initialization
	void Start () {
        aniChan = GetComponent<Animator>();
	}
	
	// Update is called once per frame
	void Update () {
        aniChan.SetFloat("RunAD", Input.GetAxis("Horizontal"));
        aniChan.SetFloat("RunWS", Input.GetAxis("Vertical"));
        //设置它的值为 -1 到 1;
	}

 二.动画层以及事件的应用

1.实现两个动画的重合使用时

Avatar Mask 骨骼遮罩

2.IKpress  反向动力学

通过子节点控制父节点,例如:通过眼睛的移动来控制头部位置的移动

Animator animator;

    //控制头部的目标物体
    public GameObject target;

    //控制手或脚的目标物体
    public GameObject targetTemp;
	// Use this for initialization
	void Start () {
        animator = GetComponent<Animator>();
	}
	/// <summary>
    /// 处理方向动力学的函数
    /// </summary>
	void OnAnimatorIK()
    {
        if (target != null)
        {
            //设置目标对象的权重
            animator.SetLookAtWeight(1);

            //看向目标物体的位置  来控制头部的移动
            animator.SetLookAtPosition(target.transform.position);
        }
        if (targetTemp != null)
        {
            //设置 左手的 位置和旋转 权重
            animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);
            animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1);

            //设置 人物IK的移动
            animator.SetIKPosition(AvatarIKGoal.LeftHand, targetTemp.transform.position);
            animator.SetIKRotation(AvatarIKGoal.LeftHand, targetTemp.transform.rotation);
        }

    }

 三.寻路系统

 1.NavMesh  导航网格

(1)NavigationStatic  设置为静态

(2)Back 烘焙面板

(3)实现自动寻路 NavMeshAgent.SetDestination( Vector3 ) 

agent.SetDestination(target.position);

(4)实现鼠标点击自动寻路

引用——using UnityEngine.AI;

//NavMeshAgent  网格代理
    NavMeshAgent agent;
    // 需要寻找的目标物体
    public Transform target;
    //射线
    Ray ray;
    //被检测到的物体
    RaycastHit hit;
	// Use this for initialization
	void Start () {
        agent = GetComponent<NavMeshAgent>();
	}
	
	// Update is called once per frame
	void Update () {
        //实现寻路
        //agent.SetDestination(target.position);

        //从主相机射出 射线 的位置为鼠标所在的位置
        ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if(Physics.Raycast(ray,out hit, 100))
        {
            //鼠标点击左键 
            if (Input.GetMouseButtonDown(0))
            {
                //找到鼠标点击到的位置
                agent.SetDestination(hit.point);
            }
        }
	}

(5)NavMeshAgent组件

Stoping Distance 停止距离 跟需要寻找的对象的距离

Auto BraKing  自动制动

Obstacle Avoidance 避障   避免两个寻路物体穿透,可以调整障碍盒的大小

Priority  寻路物体的优先级 数字越小 优先级越高(0-99)

(6) NavMeshObstacle  实现动态障碍物的遮挡

Carve 实现动态遮挡

Carve Only Stationa 是否实现实时动态遮挡  勾选则是在静止后对NavMesh网格进行去除 不勾选则实时去除

(7)Off Mesh LInk 断开网格链接

可以搭建一个线性的桥 从而使使两个物体之间跳跃过去

设置双向的桥,进行连接跳跃

【烘焙遇到的问题】当物体需要被烘焙时,没有烘焙上,可能是没有采样上,

一是可以放在NavMesh中的白线上,重新烘焙一下进行采样

二是可以进行调整物体的大小,等调整到一定程度上就会显示烘焙到物体上的网格

(8)Areas

Areas Mark 区域遮罩  可以在可视的组件编辑面板上勾选,也可以通过2ⁿ在代码中表示,2ⁿ表示的为第n层

NavMeshAgent.areaMask = -1;

0代表nothing层,-1代表everything,2ⁿ代表第n层,x<<n 表示x·2ⁿ

NavMesh寻找的是消耗最少的路程,不一定是最近的路

Test】寻路练习

  //需要一个计时器 进行计算
    float t = 1;
    //实例化小球 需要一个小球的预制体
    public GameObject spherePrefab;


    //目标位置
    public Transform target;
    //一个颜色的数组
    Color[] c = { Color.red, Color.green, Color.blue };
    
    // Use this for initialization
    void Start () {
        
       

    }
	
	// Update is called once per frame
	void Update () {
        t += Time.deltaTime;
        if (t > 3)
        {
            t = 0;
            NavMeshAgent agent = CreateSphere();
            agent.SetDestination(target.position);
            Destroy(agent.gameObject, 10f);
        }
	}
    
    //实例化小球
    public NavMeshAgent CreateSphere()
    {
        int r = Random.Range(0, 3);
        //实例化小球
        GameObject go = Instantiate(spherePrefab);
        //给小球添加颜色
        go.GetComponent<MeshRenderer>().material.color = c[r];
        //获取 agent的组件
        NavMeshAgent goagent = go.AddComponent<NavMeshAgent>();

        goagent.areaMask = GetAreaMarkFuc(r);


        return goagent;
    }

    /// <summary>
    /// 获取区域遮罩
    /// </summary>
    /// <param name="sphereColor"></param>
    /// <returns></returns>
    public int GetAreaMarkFuc(int r)
    {
        //设置区域遮罩的值为0
        int area = 0;
        switch (r)
        {
            case 0:
                area = 1 + 8;
                break;
            case 1:
                area = 1 + 16;
                break;
            case 2:
                area = 1 + 32;
                break;
            default:
                break;
        }
        return area;
    }

四.NavMeshComponent  导航网格新组件

1.NavMeshComponent插件的具体应用

进击的新版NavMesh系统:看我飞檐走壁 - 慕容小匹夫 - 博客园 (cnblogs.com)

2.下载地址 GitHub

GitHub - Unity-Technologies/NavMeshComponents: High Level API Components for Runtime NavMesh Building

3.插件的使用

(1)Nav Mesh Surface

不需要设置静态,可以直接在组件操作上选择烘焙

(2)针对不同的Agent 烘焙出不同的 导航网格

设置AgentType 

NavMeshSurface组件在同一个对象上可以多次添加

(3)可以烘焙垂直的平面

当有垂直面和水平面时,不能直接相连移动,需要通过NavMesh中的跳跃来进行实现

 

 

标签:target,void,agent,unity,烘焙,笔记,Day12,NavMeshAgent,animator
来源: https://blog.csdn.net/weixin_45344894/article/details/119021877

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有