【游戏技术群】959392658  【游戏出海群】12067810
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2373

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

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

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

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

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

116

主题

551

帖子

6751

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
106
蛮牛币
4680
威望
0
注册时间
2013-9-10
在线时间
1441 小时
最后登录
2018-12-14

专栏作家社区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、完整的工程地址

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





评分

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

查看全部评分

本帖被以下淘专辑推荐:


回复

使用道具 举报

7日久生情
1665/5000
排名
2312
昨日变化
4

17

主题

656

帖子

1665

积分

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

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

回复 支持 反对

使用道具 举报

7日久生情
3434/5000
排名
1702
昨日变化
5

0

主题

2127

帖子

3434

积分

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

UID
219676
好友
1
蛮牛币
2633
威望
0
注册时间
2017-7-12
在线时间
559 小时
最后登录
2018-12-14

活力之星

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

回复

使用道具 举报

4四处流浪
371/500
排名
7162
昨日变化
3

0

主题

91

帖子

371

积分

Rank: 4

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

回复

使用道具 举报

7日久生情
4183/5000
排名
168
昨日变化

18

主题

316

帖子

4183

积分

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

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

回复

使用道具 举报

5熟悉之中
821/1000
排名
3757
昨日变化
12

0

主题

89

帖子

821

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
1585/5000
排名
1438
昨日变化
5

0

主题

467

帖子

1585

积分

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

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

回复 支持 反对

使用道具 举报

排名
14369
昨日变化
4

0

主题

17

帖子

97

积分

Rank: 2Rank: 2

UID
296810
好友
0
蛮牛币
184
威望
0
注册时间
2018-9-12
在线时间
26 小时
最后登录
2018-12-14
发表于 2018-10-13 09:09:11 | 显示全部楼层

回复

使用道具 举报

5熟悉之中
766/1000
排名
3437
昨日变化
18

1

主题

133

帖子

766

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

5熟悉之中
563/1000
排名
4710
昨日变化
2

0

主题

120

帖子

563

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

5熟悉之中
705/1000
排名
3145
昨日变化
20

2

主题

65

帖子

705

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

5熟悉之中
897/1000
排名
3437
昨日变化
18

0

主题

212

帖子

897

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
2694/5000
排名
591
昨日变化
4

1

主题

749

帖子

2694

积分

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

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

回复 支持 反对

使用道具 举报

排名
21637
昨日变化
15

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蛮牛粉丝
1166/1500
排名
1795
昨日变化
2

8

主题

176

帖子

1166

积分

Rank: 6Rank: 6Rank: 6

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

回复

使用道具 举报

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

本版积分规则

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