美文网首页
Unity中,将角色外观分为动画外观和物理外观,在合适的时机切换

Unity中,将角色外观分为动画外观和物理外观,在合适的时机切换

作者: 全新的饭 | 来源:发表于2023-10-11 16:19 被阅读0次

用途

常规情况下使用动画外观,当角色死亡时,切换为物理外观。

实现思路

角色根节点下,有2个子节点:动画外观根节点、物理外观根节点。


角色层级说明

二者的子孙transform层级完全一致(包括名称)
动画外观根节点上挂有Animator组件。
物理外观的子孙节点中有Rigidbody(下文简称Rb)Collider、Joint等。

实现一个RoleAppearance类。
在初始化时,创建所有物理外观下Rb与动画外观下对应同名Transform的对应关系。

当切换至物理外观时:

  1. 隐藏动画外观
  2. 将动画外观中下各Transform的属性(位置、旋转、缩放)赋到对应的Rb的Transform上,将Rb的isKinematic设置为false。
  3. 将动画外观的Transform属性赋给物理外观的Transform。
  4. 显示物理外观

当切换至动画外观时:

  1. 隐藏物理外观
  2. 将各Rb的Transform的属性赋到动画外观下对应的Transform上,Rb的isKinematic设置为true。
  3. 将物理外观的Transform属性赋给动画外观的Transform。
  4. 显示动画外观

RoleAppearance.cs

using System.Transactions;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RoleAppearance : MonoBehaviour
{
    [SerializeField]
    private GameObject _animAppearance;
    [SerializeField]
    private GameObject _phyAppearance;

    // 物理外观下的Rb-动画外观下的同名Trans
    private Dictionary<Rigidbody, Transform> _rbTransDict;

    private void Start()
    {
        Init();
    }

    private void OnDestroy()
    {
        MyDestroy();
    }

    private void Init()
    {
        InitRbTransDict();
        ShowAnimAppearance();

        void InitRbTransDict()
        {
            _rbTransDict = new Dictionary<Rigidbody, Transform>();
            var rbs = _phyAppearance.GetComponentsInChildren<Rigidbody>();
            var animAppearanceChildren = _animAppearance.GetComponentsInChildren<Transform>();
            var animAppearanceChildrenDict = new Dictionary<string, Transform>();
            foreach (var c in animAppearanceChildren)
            {
                animAppearanceChildrenDict.Add(c.name, c);
            }

            foreach (var rb in rbs)
            {
                _rbTransDict.Add(rb, animAppearanceChildrenDict[rb.name]);
            }
        }
    }
    private void MyDestroy()
    {
        DestroyRbTransDict();

        void DestroyRbTransDict()
        {
            _rbTransDict.Clear();
            _rbTransDict = null;
        }
    }

    public void ShowAnimAppearance()
    {
        _phyAppearance.SetActive(false);
        SetRbTransInfo(false);
        _animAppearance.SetActive(true);
    }
    public void ShowPhyAppearance()
    {
        _animAppearance.SetActive(false);
        SetRbTransInfo(true);
        _phyAppearance.SetActive(true);
    }

    // 若是false,则将物理外观下的目标trans的信息赋予动画外观下的对应trans
    private void SetRbTransInfo(bool isAnimToPhy)
    {
        foreach (var rb in _rbTransDict.Keys)
        {
            if (isAnimToPhy)
            {
                CopyTransformInfo(_rbTransDict[rb], rb.transform);
                rb.isKinematic = false;
            }
            else
            {
                CopyTransformInfo(rb.transform, _rbTransDict[rb]);
                rb.isKinematic = true;
            }
        }

        if (isAnimToPhy)
        {
            CopyTransformInfo(_animAppearance.transform, _phyAppearance.transform);
        }
        else
        {
            CopyTransformInfo(_phyAppearance.transform, _animAppearance.transform);
        }
    }

    private void CopyTransformInfo(Transform from, Transform to)
    {
        to.position = from.position;
        to.rotation = from.rotation;
        to.localScale = from.localScale;
    }
}

相关文章

  • 外观模式

    定义 在外观模式中有几个角色: 外观角色:外观角色了解子系统所有的方法,外观角色也有自己的方法,客户端通过调用外观...

  • 外观模式

    外观模式:降低客户端与子系统的耦合度。 (1) Facade(外观角色):在客户端可以调用它的方法,在外观角色中可...

  • 12.外观模式(结构型,也称为门面模式)

    外观模式(结构型) 一、概述 外观模式中,一个子系统的外部与其内部的通信通过一个统一的外观类进行,外观类将客户类与...

  • 再发篇文章试试

    tags: WinJS 通过使用Windows提供的动画的“动画库”套件,你可以将Windows 8外观和感觉集成...

  • 设置电脑屏幕护眼配色

    在电脑桌面空白处单击右键“个性化”→“窗口颜色”→“高级外观设置”,在弹出的窗口颜色和外观中,将“窗口”颜色选为其...

  • 热门有趣的数据图有哪些制作妙招

    实物与图表相结合 条形图 找到合适的图形,你也可以很轻松的在 PPT 中实现 物化图表外观 物化图表外观,既可以使...

  • 外观

    因为没有警戒的焦虑 苦难逐渐开始沸腾 惊恐被传言包围着 可那单纯为之奉献的灵魂 没能阻拦无知地侵蚀 肉体屈服了 道...

  • 外观

    通过外观的活动协助我们去撞击到我的内在,回到我的内在去看:我看到这个叶子好漂亮,这个好漂亮是我的投射,我的喜怒哀乐...

  • ArcMenu

    仿Path带动画效果的扇形菜单 用法 改变外观可以在xml中 或者在java中 ArcMenu

  • 第4章 结构型模式-外观模式

    一、外观模式的简介 二、外观模式的优缺点 三、外观模式的场景 四、外观模式的实例

网友评论

      本文标题:Unity中,将角色外观分为动画外观和物理外观,在合适的时机切换

      本文链接:https://www.haomeiwen.com/subject/jcxnbdtx.html