IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity 角色翻墙、滑行、扛木头 代码 -> 正文阅读

[游戏开发]Unity 角色翻墙、滑行、扛木头 代码

翻墙:

void ProcessVault()
    {
        bool isVault = false;
        if (anim.GetFloat(SpeedZID) > 3 && anim.GetCurrentAnimatorStateInfo(0).IsName("Locomotion"))
        {
            RaycastHit hit;
            if (Physics.Raycast(transform.position + Vector3.up * 0.3f, transform.forward, out hit, 4f))//射线检测
            {
                if (hit.collider.tag == "Obstacle")//检测是否碰见墙
                {
                    if (hit.distance > 3f)
                    {
                        Vector3 point = hit.point;//获取与墙撞击的点
                        point.y = hit.collider.transform.position.y + hit.collider.bounds.size.y + 0.1f;//撞击点的y轴应加上墙自身高度
                        matchTarget = point;
                        isVault = true;
                    }
                }
            }
        }
        anim.SetBool(VaultID, isVault);

        if (anim.IsInTransition(0) == false && anim.GetCurrentAnimatorStateInfo(0).IsName("Vault"))
        {
            anim.MatchTarget(matchTarget, Quaternion.identity, AvatarTarget.LeftHand, new MatchTargetWeightMask(Vector3.one, 0), 0.32f, 0.4f);
            //执行MatchTarget函数,第一个参数是绑定的位置,第二个参数是旋转,第三个是要绑定的骨骼,是一个枚举类型,
            //第四个是MatchTargetWeightMask,可以new一个,有参构造函数第一个参数Vector3类型代表xyz的权重,
            //如果为(1,1,1)表示位置要完全相同,第二个参数是一个float类型,表示旋转的权重,1表示完全相同,0表示无关,
            //第五个参数是从动画的x%开始绑定位置,第六个参数是到什么时候绑定结束,
            //函数会在这两个参数之间的动画播放的时候将位置插值运算过去以不显得绑定突兀,
            //所以这两个位置应该选择在翻越动画之前一点点,以达到翻越的时候已经绑定好位置的目的
        }

        characterController.enabled = anim.GetFloat(ColliderID) <= 0.5f;
    }

滑行

void ProcessSlider()
    {
        bool isSlider = false;
        if (anim.GetFloat(SpeedZID) > 3 && anim.GetCurrentAnimatorStateInfo(0).IsName("Locomotion"))
        {
               RaycastHit hit;
            if (Physics.Raycast(transform.position + Vector3.up * 1.5f, transform.forward, out hit, 4f))
            {
                if (hit.collider.tag == "Obstacle")
                {
                    if (hit.distance > 2f)
                    {
                        Vector3 point = hit.point;//获取与墙撞击的点
                        matchTarget = point + transform.forward * 2;
                        isSlider = true;
                    }
                }
            }
        }
        anim.SetBool(SliderID, isSlider);
        if (anim.IsInTransition(0) == false && anim.GetCurrentAnimatorStateInfo(0).IsName("Slider"))
        {
            anim.MatchTarget(matchTarget, Quaternion.identity, AvatarTarget.Root, new MatchTargetWeightMask(new Vector3(1,0,1), 0), 0.13f, 0.67f);
        }
        characterController.enabled = anim.GetFloat(ColliderID) <= 0.5f;
    }

扛木头

使用IK动画

private void OnTriggerEnter(Collider other)
    {
        if(other.tag == "Log")
        {
            Destroy(other.gameObject);
            CarryWood();
        }
    }
    private void CarryWood()
    {
        UnityLog.SetActive(true);
        anim.SetBool(isHoldLogID, true);
    }

    private void OnAnimatorIK(int layerIndex)
    {
        if(layerIndex == 1)//确保在当前层
        {
            int weight = anim.GetBool(isHoldLogID) ? 1 : 0;//用是否进行扛起动画判断权重
            anim.SetIKPosition(AvatarIKGoal.LeftHand, LeftHand.position);//设置局部位置
            anim.SetIKPositionWeight(AvatarIKGoal.LeftHand, weight);//设置局部位置权重
            anim.SetIKRotation(AvatarIKGoal.LeftHand, LeftHand.rotation);//设置局部旋转
            anim.SetIKRotationWeight(AvatarIKGoal.LeftHand, weight);//设置局部旋转权重

            anim.SetIKPosition(AvatarIKGoal.RightHand, RightHand.position);
            anim.SetIKPositionWeight(AvatarIKGoal.RightHand, weight);
            anim.SetIKRotation(AvatarIKGoal.RightHand, RightHand.rotation);
            anim.SetIKRotationWeight(AvatarIKGoal.RightHand, weight);
        }
    }
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-07-17 12:15:58  更:2021-07-17 12:17:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 5:28:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码