码哥驾到

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 866|回复: 0

unity3d的两个立方体&两个球体碰撞检测(c#代码实现)

[复制链接]

185

主题

217

帖子

1016

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1016

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

发表于 2022-2-24 23:57:44 | 显示全部楼层 |阅读模式
由于unity自带的碰撞组件特别耗费性能,网上的unity物体碰撞的c#代码实现比较少,没有适合的,只能自己写一个来用:
立方体:


  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;

  4. namespace Assets
  5. {
  6.     class Class1 : MonoBehaviour
  7.     {
  8.         List<Action> listAction = new List<Action>();
  9.         //用来检测碰撞的间隔时间(可以直接把检测放入update()中,不过100毫秒的定时器效果上也能实现)
  10.         System.Timers.Timer timer = new System.Timers.Timer();
  11.         //原坐标
  12.         Vector3 oldPoint;
  13.         //要移动的坐标
  14.         Vector3 point;
  15.         //0:待机;1:移动
  16.         int currentState = 0;
  17.         //是否可以移动
  18.         bool canMove = true;

  19.         // Use this for initialization
  20.         void Start()
  21.         {
  22.             oldPoint = transform.position;
  23.             timer.Interval = 100;
  24.             timer.Enabled = true;
  25.             timer.Elapsed += (a, b) => isMove(point);
  26.         }

  27.         // Update is called once per frame
  28.         void Update()
  29.         {
  30.             foreach (Action a in listAction) {
  31.                 a();
  32.             }
  33.             listAction.Clear();
  34.             point = transform.position;
  35.             if (currentState == 1) {
  36.                 if (checkCollision()) {
  37.                     canMove = false;
  38.                 }
  39.             }
  40.         }

  41.         void isMove(Vector3 position) {
  42.             if (oldPoint != position)
  43.             {
  44.                 if (!canMove)
  45.                 {
  46.                     listAction.Add(new Action(()=> gameObject.transform.position = oldPoint));
  47.                     canMove = true;
  48.                 }
  49.                 else {
  50.                     currentState = 1;
  51.                     oldPoint = position;
  52.                 }
  53.             }
  54.             else {
  55.                 currentState = 0;
  56.             }
  57.         }

  58.         bool checkCollision() {
  59.             Vector3 zzPoint = gameObject.transform.position;
  60.             Vector3 zzScale = gameObject.transform.localScale;
  61.             //另一物体坐标信息
  62.             GameObject dm = GameObject.Find("Cube (1)");
  63.             Vector3 dmPoint = dm.transform.position;
  64.             Vector3 dmScale = dm.transform.localScale;

  65.             //坐标检测(当两个物体的x、y、z方向间距都小于两个物体在该方向上的长度)
  66.             if ((Math.Abs(zzPoint.x - dmPoint.x) <= zzScale.x / 2 + dmScale.x / 2) &&
  67.                 (Math.Abs(zzPoint.y - dmPoint.y) <= zzScale.y / 2 + dmScale.y / 2) &&
  68.                 (Math.Abs(zzPoint.z - dmPoint.z) <= zzScale.z / 2 + dmScale.z / 2))
  69.             {
  70.                 return true;
  71.             }
  72.             return false;
  73.         }
  74.     }
  75. }
复制代码
球体:
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;

  5. public class sphereCollision : MonoBehaviour {

  6.     List<Action> listAction = new List<Action>();
  7.     //用来检测碰撞的间隔时间(可以直接把检测放入update()中,不过100毫秒的定时器效果上也能实现)
  8.     System.Timers.Timer timer = new System.Timers.Timer();
  9.     //原坐标
  10.     Vector3 oldPoint;
  11.     //要移动的坐标
  12.     Vector3 point;
  13.     //0:待机;1:移动
  14.     int currentState = 0;
  15.     //是否可以移动
  16.     bool canMove = true;

  17.     // Use this for initialization
  18.     void Start()
  19.     {
  20.         oldPoint = transform.position;
  21.         timer.Interval = 100;
  22.         timer.Enabled = true;
  23.         timer.Elapsed += (a, b) => isMove(point);
  24.     }

  25.     // Update is called once per frame
  26.     void Update()
  27.     {
  28.         foreach (Action a in listAction)
  29.         {
  30.             a();
  31.         }
  32.         listAction.Clear();
  33.         point = transform.position;
  34.         if (currentState == 1)
  35.         {
  36.             if (sphereCheckCollision())
  37.             {
  38.                 canMove = false;
  39.             }
  40.         }
  41.     }

  42.     void isMove(Vector3 position)
  43.     {
  44.         if (oldPoint != position)
  45.         {
  46.             if (!canMove)
  47.             {
  48.                 listAction.Add(new Action(() => gameObject.transform.position = oldPoint));
  49.                 canMove = true;
  50.             }
  51.             else
  52.             {
  53.                 currentState = 1;
  54.                 oldPoint = position;
  55.             }
  56.         }
  57.         else
  58.         {
  59.             currentState = 0;
  60.         }
  61.     }

  62.     bool sphereCheckCollision()
  63.     {
  64.         Vector3 zzPoint = gameObject.transform.position;
  65.         Vector3 zzScale = gameObject.transform.localScale;
  66.         //另一物体坐标信息
  67.         GameObject dm = GameObject.Find("Sphere (1)");
  68.         Vector3 dmPoint = dm.transform.position;
  69.         Vector3 dmScale = dm.transform.localScale;

  70.         //坐标检测(当两个圆相切时,圆心距离为r1+r2,两个圆心在x、y、z上的距离差为x1、x2、x3,用三角函数计算时至少计算两个维度的距离差才能和圆心距进行比较)
  71.         if ((Math.Sqrt(Math.Pow(Math.Abs(zzPoint.x - dmPoint.x), 2) + Math.Pow(Math.Abs(zzPoint.y - dmPoint.y), 2)) <= zzScale.x / 2 + dmScale.x / 2) &&
  72.             (Math.Sqrt(Math.Pow(Math.Abs(zzPoint.x - dmPoint.x), 2) + Math.Pow(Math.Abs(zzPoint.z - dmPoint.z), 2)) <= zzScale.x / 2 + dmScale.x / 2) &&
  73.             (Math.Sqrt(Math.Pow(Math.Abs(zzPoint.y - dmPoint.y), 2) + Math.Pow(Math.Abs(zzPoint.z - dmPoint.z), 2)) <= zzScale.x / 2 + dmScale.x / 2))
  74.         {
  75.             return true;
  76.         }
  77.         return false;
  78.     }

  79. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|码哥驾到 ( 京ICP备15044914号-1 )

GMT+8, 2022-5-25 11:19 , Processed in 0.062500 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表