Unity IK로 바닥의 모양에 맞춰 발을 땅에 대세요.

10526 단어 IKUnityC#

컨디션


Unity2017.3.1p4
Windows10

창고.


다음 링크
Asset/Scripts/FootIK.cs
창고를 공개하고 있습니다.

How to

  • Animatior에서 IK를 유효하게 만들 기어
  • 를 클릭
  • Window의 IKPass를 ON
  • 으로 설정
  • Scene에 있는 객체의 GameObject를 선택하여 Animator와 부착된 동일한 GameObject
  • 에 FootIK를 부착합니다.
  • Inspector에서 바닥의 도면층 이름을 설정한 후 완성

  • 결실


    왼쪽에는 UnityChan이 일반이고 오른쪽에는 FootIK가 유효합니다.

    출처

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class FootIK : MonoBehaviour {
        [SerializeField]
        private Vector3 offset = new Vector3(0,0.1f,0);
        [SerializeField]
        private float rayRange = 1f;
        [SerializeField]
        private string fieldLayerName = "Field";
    
        private Animator animator;
    
        private Transform _transform;
        public new Transform transform {
            get
            {
                if (_transform == null)
                {
                    _transform = gameObject.transform;
                }
                return _transform;
            }
        }
    
    
        void Start()
        {
            animator = GetComponent<Animator>();
        }
    
        void OnAnimatorIK()
        {
            //右足
            var ray = new Ray(animator.GetIKPosition(AvatarIKGoal.RightFoot), -transform.up);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, rayRange, LayerMask.GetMask(fieldLayerName)))
            {
                Quaternion rightRotation = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
                //weightはとりあえず1で固定しておく(0f:元のアニメーション,1f:IKを完全に反映)
                animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1);
                animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1);
                animator.SetIKPosition(AvatarIKGoal.RightFoot, hit.point + offset);
                animator.SetIKRotation(AvatarIKGoal.RightFoot, rightRotation);
            }
    
            //左足
            ray = new Ray(animator.GetIKPosition(AvatarIKGoal.LeftFoot), -transform.up);
            if (Physics.Raycast(ray, out hit, rayRange, LayerMask.GetMask(fieldLayerName)))
            {
                Quaternion leftRotaion = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
    
                animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1);
                animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1);
                animator.SetIKPosition(AvatarIKGoal.LeftFoot, hit.point + offset);
                animator.SetIKRotation(AvatarIKGoal.LeftFoot, leftRotaion);
            }
        }
    }
    
    
    
    

    하면, 만약, 만약...


    3D 모델의 FBX를 선택하고 Rig 태그의 Configure 를 클릭합니다.
    매핑이 잘 되고 있는지 확인하는 게 좋을 것 같아요.

    좋은 웹페이지 즐겨찾기