软件开发教程 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试
游戏开发 网络协议 系统运维 HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程
C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
 
   -> 游戏开发 -> 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);
        }
    }
  游戏开发 最新文章
Fake3D && Depth Map && C
关于 Unity 启动弹 Your project was last
【洛谷】 P2670 [NOIP2015 普及组] 扫雷游戏
用Python做的打飞机小游戏
Unity Layer预设 默认设置Layer
unity 光照烘焙效果很虚的问题
“三子棋“小游戏
Unity 通过自定义菜单将资源导出
c#委托和事件和unity应用
unity 发布成Web后,打开外部链接
上一篇文章      下一篇文章      查看所有文章
加:2021-07-17 12:15:58  更:2021-07-17 12:17:08 
 
360图书馆 购物 三丰科技 阅读网 日历 万年历 2021年7日历 -2021/7/27 3:10:31-
图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  软件开发教程