游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2337

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 934|回复: 57

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

[复制链接]  [移动端链接]
排名
140
昨日变化

114

主题

550

帖子

6673

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
103
蛮牛币
4373
威望
0
注册时间
2013-9-10
在线时间
1416 小时
最后登录
2018-10-23

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

发表于 2018-10-12 16:21:18 | 显示全部楼层 |阅读模式

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

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

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

SwordShadow2.gif


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

Test.gif

      一种解决方法时,将碰撞检测的计算方式改为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、完整的工程地址

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





本帖被以下淘专辑推荐:


回复

使用道具 举报

6蛮牛粉丝
1452/1500
排名
2649
昨日变化
15

11

主题

592

帖子

1452

积分

Rank: 6Rank: 6Rank: 6

UID
214924
好友
3
蛮牛币
3602
威望
0
注册时间
2017-3-28
在线时间
333 小时
最后登录
2018-10-23
发表于 2018-10-12 17:23:51 | 显示全部楼层
咋感觉光在说:“剑你等等我啊”

回复 支持 反对

使用道具 举报

7日久生情
3305/5000
排名
1922
昨日变化
9

0

主题

2122

帖子

3305

积分

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

UID
219676
好友
1
蛮牛币
2422
威望
0
注册时间
2017-7-12
在线时间
515 小时
最后登录
2018-10-23

活力之星

发表于 2018-10-12 17:42:15 | 显示全部楼层
谢谢分享

回复

使用道具 举报

3偶尔光临
240/300
排名
11169
昨日变化
143

0

主题

85

帖子

240

积分

Rank: 3Rank: 3Rank: 3

UID
294434
好友
0
蛮牛币
89
威望
0
注册时间
2018-8-23
在线时间
71 小时
最后登录
2018-10-23
发表于 2018-10-12 19:03:40 | 显示全部楼层
学习了学习了

回复

使用道具 举报

7日久生情
4177/5000
排名
153
昨日变化

18

主题

314

帖子

4177

积分

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

UID
67323
好友
1
蛮牛币
3336
威望
0
注册时间
2015-1-10
在线时间
1645 小时
最后登录
2018-10-23
发表于 2018-10-13 05:42:37 | 显示全部楼层
有技术就是任性~

回复

使用道具 举报

5熟悉之中
677/1000
排名
4555
昨日变化
22

0

主题

76

帖子

677

积分

Rank: 5Rank: 5

UID
108091
好友
0
蛮牛币
39
威望
0
注册时间
2015-6-14
在线时间
299 小时
最后登录
2018-10-23
发表于 2018-10-13 08:34:29 | 显示全部楼层
感谢谢分享

回复

使用道具 举报

6蛮牛粉丝
1401/1500
排名
1615
昨日变化
7

0

主题

404

帖子

1401

积分

Rank: 6Rank: 6Rank: 6

UID
87577
好友
0
蛮牛币
4665
威望
0
注册时间
2015-3-31
在线时间
241 小时
最后登录
2018-10-23
发表于 2018-10-13 08:37:21 | 显示全部楼层
too good too strong!

回复 支持 反对

使用道具 举报

排名
19114
昨日变化
13

0

主题

10

帖子

50

积分

Rank: 2Rank: 2

UID
296810
好友
0
蛮牛币
104
威望
0
注册时间
2018-9-12
在线时间
12 小时
最后登录
2018-10-22

一贫如洗

发表于 2018-10-13 09:09:11 | 显示全部楼层

回复

使用道具 举报

5熟悉之中
604/1000
排名
4239
昨日变化
35

1

主题

107

帖子

604

积分

Rank: 5Rank: 5

UID
241898
好友
0
蛮牛币
11
威望
0
注册时间
2017-9-6
在线时间
168 小时
最后登录
2018-10-23
发表于 2018-10-13 11:03:48 | 显示全部楼层
厉害了~~~

回复

使用道具 举报

4四处流浪
470/500
排名
5465
昨日变化
39

0

主题

102

帖子

470

积分

Rank: 4

UID
171160
好友
0
蛮牛币
1124
威望
0
注册时间
2016-9-22
在线时间
122 小时
最后登录
2018-10-24
发表于 2018-10-13 12:37:15 | 显示全部楼层

回复

使用道具 举报

5熟悉之中
609/1000
排名
3622
昨日变化
10

2

主题

61

帖子

609

积分

Rank: 5Rank: 5

UID
137533
好友
0
蛮牛币
1437
威望
0
注册时间
2016-2-25
在线时间
160 小时
最后登录
2018-10-23
发表于 2018-10-13 14:04:48 | 显示全部楼层
学习了学习了

回复

使用道具 举报

5熟悉之中
697/1000
排名
4159
昨日变化
19

0

主题

142

帖子

697

积分

Rank: 5Rank: 5

UID
2623
好友
0
蛮牛币
1240
威望
0
注册时间
2013-8-26
在线时间
223 小时
最后登录
2018-10-23
发表于 2018-10-13 16:02:42 | 显示全部楼层
[发帖际遇]: zuoyamin 在论坛发帖时没有注意,被小偷偷去了 2 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
2520/5000
排名
655
昨日变化
1

1

主题

718

帖子

2520

积分

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

UID
19501
好友
1
蛮牛币
2405
威望
0
注册时间
2014-3-29
在线时间
535 小时
最后登录
2018-10-23
发表于 2018-10-13 16:42:02 | 显示全部楼层
Unity实用小工具或脚本—刀光剑影或扫描碰撞

回复 支持 反对

使用道具 举报

排名
21261
昨日变化
6

0

主题

15

帖子

46

积分

Rank: 1

UID
289875
好友
0
蛮牛币
20
威望
0
注册时间
2018-7-15
在线时间
9 小时
最后登录
2018-10-14
发表于 2018-10-14 00:55:00 | 显示全部楼层
试试看看11111111111111

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1080/1500
排名
1912
昨日变化

7

主题

150

帖子

1080

积分

Rank: 6Rank: 6Rank: 6

UID
131585
好友
0
蛮牛币
2336
威望
0
注册时间
2015-12-13
在线时间
253 小时
最后登录
2018-10-20
发表于 2018-10-14 08:52:33 | 显示全部楼层
[发帖际遇]: 啊九 乐于助人,奖励 2 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

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

本版积分规则

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