找回密码
 注册帐号

扫一扫,访问微社区

zhang273162308 Unity实用小工具或脚本—刀光剑影或扫描碰撞

93
回复
3149
查看
打印 上一主题 下一主题
[ 复制链接 ]
排名
141
昨日变化

121

主题

567

帖子

6910

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
108
蛮牛币
5226
威望
0
注册时间
2013-9-10
在线时间
1489 小时
最后登录
2019-5-20

专栏作家活力之星游戏蛮牛QQ群会员蛮牛哥

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
一、前言
      如图所示,本文实现了一个刀剑砍的光影效果,这种效果也可以应用在诸如扫描等应用上。其实这种效果是非常一般的,其主要的目的还是





为了碰撞检测。Unity中为了减少碰撞检测的计算量,即使对象正在移动,也采用Update()被调用时的对象的坐标位置来进行碰撞检测,不会考虑对象的速度,这就会导致在执行碰撞检测时有可能出现如图所示的穿透的情况,每次剑碰到Cube就会加1,并在屏幕上现实Cube+当前碰撞的次数。正如图中所示,当剑的速度比较快的时候,可能会出现穿透而没有检测的情况。



      一种解决方法时,将碰撞检测的计算方式改为Continuous(连续的),相对于Discrete(离散的)计算方法是只使用每一帧的瞬间位置,Continuous的计算方法中,会将相邻几帧的位置坐标连起来作为碰撞检测的形状,就如同一道光影一样,这样即使是物体在高速运动时也不会发生穿透的问题

       但是Continuous有计算量大并且无法使用网格碰撞器等的缺点,因此本文将使用生成扇形的网格并附上碰撞器的方法来实现,正如前面提到的光影的效果,其实就是一个动态生成的网格。虽然,这种方法要比Continuous麻烦一点,因为要自己写实现的逻辑代码,但是使用还是非常不错的。

二、实现

1、核心思路与代码:根据前后扫过的开始角度和结束角度计算网格,处理中要注意开始角度和结束角度横跨0的情况,当开始角度和结束角度横跨12点中方向代表的0度时,给开始角度+360度。


核心计算代码如下:

[C#] 纯文本查看 复制代码
  public IEnumerator MakeFanShape(float[] angle)
    {
        yield return new WaitForSeconds(0.05f);

        float startAngle = angle[0];
        float endAngle = angle[1];

        // Debug.Log("s:"+startAngle+"e:"+endAngle);
        float radius = fanRadius;

        if (Mathf.Abs(startAngle - endAngle) > 180.0f)
        {
            if (startAngle < 180f)
            {
                startAngle += 360f;
            }
            if (endAngle < 180f)
            {
                endAngle += 360f;
            }
        }
        Vector3[] circleVertices;
        int[] circleTriangles;
        if (startAngle > endAngle)
        {
            float temp = startAngle;
            startAngle = endAngle;
            endAngle = temp;
        }
        int triangleNum = (int)Mathf.Ceil((endAngle - startAngle) / pieceAngle);
        circleVertices = new Vector3[triangleNum + 1 + 1];
        circleTriangles = new int[triangleNum * 3];

        circleVertices[0] = Vector3.zero;
        for (int i = 0; i < triangleNum + 1; i++)
        {
            float curAngle = startAngle + (float)i * pieceAngle;
            curAngle = Mathf.Min(endAngle, curAngle);
            circleVertices[i + 1] = Quaternion.AngleAxis(curAngle, Vector3.up) * Vector3.forward * radius;
        }
        for (int i = 0; i < triangleNum; i++)
        {
            circleTriangles[i * 3 + 0] = 0;
            circleTriangles[i * 3 + 1] = i + 1;
            circleTriangles[i * 3 + 2] = i + 2;
        }
        mesh.Clear();
        mesh.vertices = circleVertices;
        mesh.triangles = circleTriangles;

        mesh.RecalculateBounds();
        mesh.RecalculateNormals();

        meshFilter.mesh = mesh;

        meshCollider.enabled = false;
        meshCollider.enabled = true;
    }


这里我使用了协程的目的是增加一个延迟的感觉,让刀的挥舞之后才出现一个光影的效果,而不是同时出现。

2、控制代码如下:

[C#] 纯文本查看 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Sword : MonoBehaviour {

    [SerializeField]
    private float swordShadowTurnRate = 15;
    [SerializeField]
    private float swordShadowFowardPos = 5.5f;
    private bool isScan = false;

    [SerializeField]
    private GameObject handlePoint;

    [SerializeField]
    private Text uiText;
    private int num;
	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        if(!isScan&&Input.GetKeyDown(KeyCode.Mouse0))
        {
            isScan = true;
        }
        if(isScan&&Input.GetKeyUp(KeyCode.Mouse0))
        {
            isScan = false;
        }
        UpdateTransformMesh();
	}
  
    private void UpdateTransformMesh()
    {
        float targetRotationAngle = handlePoint.transform.eulerAngles.y;
        float currentRotationAngle = transform.eulerAngles.y;
        currentRotationAngle = Mathf.LerpAngle(
            currentRotationAngle,
            targetRotationAngle,
            swordShadowTurnRate * Time.deltaTime);
        Quaternion tiltedRotation = Quaternion.Euler(0, currentRotationAngle, 0);

        //根据角度处理扇形扫描的网格
        if (isScan)
        {
            float[] tmpAngle = new float[] { transform.eulerAngles.y, handlePoint.transform.eulerAngles.y };
            StartCoroutine(SwordShadow.M_Instance.MakeFanShape(tmpAngle));
        }
        else
        {
            SwordShadow.M_Instance.ClearShape();
        }

        transform.rotation = tiltedRotation;
        transform.position = new Vector3(
            swordShadowFowardPos * Mathf.Sin(Mathf.Deg2Rad * currentRotationAngle),
            0,
            swordShadowFowardPos * Mathf.Cos(Mathf.Deg2Rad * currentRotationAngle)
        );

    }
  
    private void OnTriggerEnter(Collider other)
    {
        num += 1;
        //  Debug.Log(other.gameObject.name);
        uiText.text = other.gameObject.name+num;
    }
}


三、总结

1、本方法纯粹从刀光剑影的效果来看是不如用粒子效果,但是兼顾了碰撞检测就比较实用了

2、完整的工程地址

游客,如果您要查看本帖隐藏内容请回复





参与人数 1鲜花 +1 收起 理由
wx_BmjMJIAJ + 1 很给力!

查看全部评分总评分 : 鲜花 +1

本帖被以下淘专辑推荐:

回复

使用道具 举报

7日久生情
2022/5000
排名
1896
昨日变化

41

主题

741

帖子

2022

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
214924
好友
4
蛮牛币
18298
威望
0
注册时间
2017-3-28
在线时间
524 小时
最后登录
2019-5-22
沙发
2018-10-12 17:23:51 只看该作者
咋感觉光在说:“剑你等等我啊”
回复 支持 反对

使用道具 举报

7日久生情
3748/5000
排名
1487
昨日变化

0

主题

2140

帖子

3748

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219676
好友
1
蛮牛币
3350
威望
0
注册时间
2017-7-12
在线时间
754 小时
最后登录
2019-5-24

活力之星

板凳
2018-10-12 17:42:15 只看该作者
谢谢分享
回复

使用道具 举报

4四处流浪
379/500
排名
7252
昨日变化

0

主题

91

帖子

379

积分

Rank: 4

UID
294434
好友
0
蛮牛币
658
威望
0
注册时间
2018-8-23
在线时间
110 小时
最后登录
2019-1-9
地板
2018-10-12 19:03:40 只看该作者
学习了学习了
回复

使用道具 举报

7日久生情
4399/5000
排名
167
昨日变化

19

主题

324

帖子

4399

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
67323
好友
1
蛮牛币
13976
威望
0
注册时间
2015-1-10
在线时间
1778 小时
最后登录
2019-5-26
5#
2018-10-13 05:42:37 只看该作者
有技术就是任性~
回复

使用道具 举报

6蛮牛粉丝
1096/1500
排名
2867
昨日变化

0

主题

106

帖子

1096

积分

Rank: 6Rank: 6Rank: 6

UID
108091
好友
0
蛮牛币
301
威望
0
注册时间
2015-6-14
在线时间
478 小时
最后登录
2019-5-24
6#
2018-10-13 08:34:29 只看该作者
感谢谢分享
回复

使用道具 举报

7日久生情
1862/5000
排名
1192
昨日变化

0

主题

546

帖子

1862

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
87577
好友
0
蛮牛币
6839
威望
0
注册时间
2015-3-31
在线时间
338 小时
最后登录
2019-5-25
7#
2018-10-13 08:37:21 只看该作者
too good too strong!
回复 支持 反对

使用道具 举报

3偶尔光临
199/300
排名
10464
昨日变化

0

主题

37

帖子

199

积分

Rank: 3Rank: 3Rank: 3

UID
296810
好友
0
蛮牛币
460
威望
0
注册时间
2018-9-12
在线时间
61 小时
最后登录
2019-5-25
8#
2018-10-13 09:09:11 只看该作者
回复

使用道具 举报

6蛮牛粉丝
1075/1500
排名
2579
昨日变化

2

主题

167

帖子

1075

积分

Rank: 6Rank: 6Rank: 6

UID
241898
好友
0
蛮牛币
28
威望
0
注册时间
2017-9-6
在线时间
340 小时
最后登录
2019-5-18
9#
2018-10-13 11:03:48 只看该作者
厉害了~~~
回复

使用道具 举报

5熟悉之中
564/1000
排名
4881
昨日变化

0

主题

119

帖子

564

积分

Rank: 5Rank: 5

UID
171160
好友
0
蛮牛币
1493
威望
0
注册时间
2016-9-22
在线时间
147 小时
最后登录
2018-11-23
10#
2018-10-13 12:37:15 只看该作者
回复

使用道具 举报

5熟悉之中
823/1000
排名
2760
昨日变化

2

主题

66

帖子

823

积分

Rank: 5Rank: 5

UID
137533
好友
1
蛮牛币
1756
威望
0
注册时间
2016-2-25
在线时间
227 小时
最后登录
2019-5-25
11#
2018-10-13 14:04:48 只看该作者
学习了学习了
回复

使用道具 举报

6蛮牛粉丝
1114/1500
排名
2807
昨日变化

0

主题

271

帖子

1114

积分

Rank: 6Rank: 6Rank: 6

UID
2623
好友
0
蛮牛币
1980
威望
0
注册时间
2013-8-26
在线时间
321 小时
最后登录
2019-5-24
12#
2018-10-13 16:02:42 只看该作者
回复

使用道具 举报

7日久生情
2998/5000
排名
533
昨日变化

1

主题

819

帖子

2998

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
19501
好友
1
蛮牛币
1311
威望
0
注册时间
2014-3-29
在线时间
726 小时
最后登录
2019-5-24
13#
2018-10-13 16:42:02 只看该作者
Unity实用小工具或脚本—刀光剑影或扫描碰撞
回复 支持 反对

使用道具 举报

排名
19947
昨日变化

0

主题

18

帖子

60

积分

Rank: 2Rank: 2

UID
289875
好友
0
蛮牛币
16
威望
0
注册时间
2018-7-15
在线时间
14 小时
最后登录
2019-4-29
14#
2018-10-14 00:55:00 只看该作者
试试看看11111111111111
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1197/1500
排名
1815
昨日变化

8

主题

185

帖子

1197

积分

Rank: 6Rank: 6Rank: 6

UID
131585
好友
0
蛮牛币
2564
威望
0
注册时间
2015-12-13
在线时间
272 小时
最后登录
2019-5-23
15#
2018-10-14 08:52:33 只看该作者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则