zoukankan      html  css  js  c++  java
  • Unity胶囊体的碰撞检测实现

    可选是否打开矩阵变换,支持xyz三种朝向

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    
    public class CapsuleDetection : MonoBehaviour
    {
        public enum Axis { X, Y, Z }
        public Transform comparePointTransform;
        public float radius;
        public float height;
        public Axis axis;
        public bool enableMatrix;
    
    
        bool ExecuteDetection()
        {
            if (comparePointTransform == null) return false;
    
            var result = false;
            var axisIndex = (int)axis;
    
            var comparePoint = comparePointTransform.position;
            var pointA = Vector3.zero;
            var pointB = Vector3.zero;
    
            if (enableMatrix)
            {
                comparePoint = transform.InverseTransformPoint(comparePoint);
                pointA[axisIndex] -= height - radius;
                pointB[axisIndex] += height - radius;
            }
            else
            {
                pointA = transform.position;
                pointB = transform.position;
    
                pointA[axisIndex] -= height - radius;
                pointB[axisIndex] += height - radius;
            }
    
            if (comparePoint[axisIndex] < pointA[axisIndex])
            {
                if (Vector3.Distance(comparePoint, pointA) <= radius)
                {
                    result = true;
                }
            }
    
            else if (comparePoint[axisIndex] > pointB[axisIndex])
            {
                if (Vector3.Distance(comparePoint, pointB) <= radius)
                {
                    result = true;
                }
            }
            else
            {
                var tmpPos = enableMatrix ? Vector3.zero : transform.position;
                tmpPos[axisIndex] = comparePoint[axisIndex];
    
                if (Vector3.Distance(comparePoint, tmpPos) <= radius)
                {
                    result = true;
                }
            }
    
            return result;
        }
    
        void OnDrawGizmos()
        {
            var color = Color.blue;
    
            if (ExecuteDetection())
            {
                color = Color.red;
            }
    
            var axisIndex = (int)axis;
            var pos1 = Vector3.zero;
            var pos2 = Vector3.zero;
    
            if (enableMatrix)
            {
                Gizmos.matrix = transform.localToWorldMatrix;
                pos1[axisIndex] -= height;
                pos2[axisIndex] += height;
            }
            else
            {
                pos1 = transform.position;
                pos2 = transform.position;
    
                pos1[axisIndex] -= height;
                pos2[axisIndex] += height;
            }
    
            DebugExtension.DrawCapsule(pos1, pos2, color, radius);
        }
    }
    View Code

    绘制胶囊体使用DebugExtension插件,在资源商店可以免费下载

  • 相关阅读:
    ASP.NET 数据绑定常用代码及其性能分析
    替代Eval的两种方式
    C# MySQL 数据库操作类
    百度地图api经纬度气死我了!
    APP审核关于3.2.1金融资格的审核回复苹果
    ios 导航栏底部黑线隐藏
    ios 涉及到支付金额计算的相关总结
    ios 图片上传与压缩,UIImagePickerController设置中文
    ios UISegmentedControl的定制
    iOS APP应用之间的跳转
  • 原文地址:https://www.cnblogs.com/hont/p/5340044.html
Copyright © 2011-2022 走看看