【学习笔记】 unity基础_Day12

一.BlendTree混合树的使用

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

2.BlendType  

1D 一维模式

【学习笔记】 unity基础_Day12

2D simple Directional

【学习笔记】 unity基础_Day12

【学习笔记】 unity基础_Day12

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】寻路练习

【学习笔记】 unity基础_Day12

  //需要一个计时器 进行计算
    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 * = go.AddComponent<NavMeshAgent>();

        *.areaMask = GetAreaMarkFuc(r);


        return *;
    }

    /// <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组件在同一个对象上可以多次添加

【学习笔记】 unity基础_Day12

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

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

【学习笔记】 unity基础_Day12

 

 

上一篇:Day12


下一篇:解决 Electron 包下载太慢问题