Unity frameIndex = (int)(timer / (1f / framePerSecond));

一次性播放的动画

最近学siki老师的打飞机Unity教程,他对动画中帧率的设置很有技巧,不仔细分析思考下还真不好理解。我做下总结。

这里写图片描述

77行到86行表示如果飞机死了,给一个爆炸动画。

78行的意思是到现在这一帧时,所花费的时间

79行算的是按照设定的帧率,那么目前应到了第几帧,分析一下:


framePerSecond是设定的帧率,表示每秒放几帧,那么1f/framePerSecond就表示一帧需要几秒,或者说每帧需要的时间。

那么79行翻译过来就是:
从动画开始到目前 已花费的总时间/每一帧需要的时间,那么也就等于目前应是第几帧。

拿吃饭做类比,假如我不停的在吃饭,我从开始吃饭到目前 已花费的总时间/我吃一碗饭所需要的时间,那么也就等于我已经吃了几碗饭,或者说我吃到了第几碗饭了。


81行也就是目前第几帧若超过了爆炸动画所需的帧数,则说明爆炸动画已经放完了,则销毁飞机GameObject

84行,否则,则显示一帧图片到飞机GameObject中的sprite中,

一定时间内循环播放的动画

另一个,就是飞机被击中时(beHit),会在一个较短的时间内(0.2s),循环显示两帧图片(正常的图片,被打时的图片),得到一个被打得一颤一颤的效果。关键代码是这个↓,也是在update里运行的。

这里写图片描述

53行中,hitTimer表示还剩hitTimer这么多时间播放动画,是个倒计时,时间到了就不播放被打得一颤一颤的动画了

54行,resetHitTime表示一定时间内循环播放的动画的这个“一定时间”,resetHitTime=0.2f,就表示要播放被打得一颤一颤的这个动画,播放0.2秒,那么
resetHitTime-hitTimer就表示
预定要播放的时间 - 还剩的时间 = 现已花费(播放)的时间

hitTimer就是从resetHitTime开始,一直减减减到0的嘛,思考一下~

所以又回到的上面的问题了,故
(resetHitTime-hitTimer)/(1f/framePerSecond)就等于按照设定的帧率的话,目前应是第几帧图片了。
然后为了循环播放,和2求余数,因为只有2帧图片,得到0,1,0,1,0,1…循环显示,后面不赘述了(实验室要熄灯啦!!)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里提供一个利用射线检测方法生成扇形面的示例代码,并加上注释说明: ```csharp using UnityEngine; [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] public class FanShape : MonoBehaviour { public float radius = 1f; // 扇形的半径 public float angle = 90f; // 扇形的角度(以度为单位) public int segments = 24; // 扇形的分段数 private MeshFilter meshFilter; private MeshRenderer meshRenderer; private Mesh mesh; void Start() { meshFilter = GetComponent<MeshFilter>(); meshRenderer = GetComponent<MeshRenderer>(); mesh = new Mesh(); meshFilter.mesh = mesh; // 生成扇形面的顶点数组 Vector3[] vertices = new Vector3[segments + 1]; vertices[0] = Vector3.zero; float anglePerSegment = angle / segments; for (int i = 1; i <= segments; i++) { float angleRad = Mathf.Deg2Rad * (i * anglePerSegment); vertices[i] = new Vector3(Mathf.Cos(angleRad), 0f, Mathf.Sin(angleRad)) * radius; } // 生成扇形面的三角形索引数组 int[] triangles = new int[segments * 3]; for (int i = 0; i < segments; i++) { triangles[i * 3] = 0; triangles[i * 3 + 1] = i + 1; triangles[i * 3 + 2] = i == segments - 1 ? 1 : i + 2; } mesh.vertices = vertices; mesh.triangles = triangles; // 生成初始颜色数组 Color[] colors = new Color[vertices.Length]; for (int i = 0; i < colors.Length; i++) { colors[i] = Color.red; } mesh.colors = colors; } void Update() { // 射线检测并更新颜色 RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit)) { Vector3 hitPoint = transform.InverseTransformPoint(hit.point); // 将世界坐标系坐标转换为本地坐标系坐标 Vector2 hitPoint2D = new Vector2(hitPoint.x, hitPoint.z); // 将坐标系限制在 x-z 平面上 float hitAngle = Mathf.Atan2(hitPoint2D.y, hitPoint2D.x) * Mathf.Rad2Deg; // 计算射线击中点的角度 while (hitAngle < 0f) hitAngle += 360f; hitAngle %= 360f; float deltaAngle = angle / segments; for (int i = 0; i <= segments; i++) { float angleRad = Mathf.Deg2Rad * (i * deltaAngle); Vector2 vertex2D = new Vector2(Mathf.Cos(angleRad), Mathf.Sin(angleRad)) * radius; if (Vector2.Dot(vertex2D, hitPoint2D) >= radius * Mathf.Cos(deltaAngle * Mathf.Deg2Rad)) { mesh.colors[i] = Color.green; // 将射线检测到的扇形面的颜色设置为绿色 } else { mesh.colors[i] = Color.red; // 将射线未检测到的扇形面的颜色设置为红色 } } mesh.colors[0] = Color.yellow; // 将扇形面中心的颜色设置为黄色 } else { // 当射线没有击中物体时,将所有扇形面的颜色重置为红色 Color[] colors = new Color[mesh.colors.Length]; for (int i = 0; i < colors.Length; i++) { colors[i] = Color.red; } mesh.colors = colors; } mesh.RecalculateNormals(); // 重新计算法线 } } ``` 以上代码中,首先在 Start() 方法中生成了扇形面的顶点数组和三角形索引数组,并通过 mesh.vertices 和 mesh.triangles 将其赋值给 Mesh 对象。同时,还生成了初始颜色数组,将其通过 mesh.colors 设置给 Mesh 对象。 在 Update() 方法中,通过 Physics.Raycast 方法检测鼠标射线是否与扇形面相交,并计算出射线击中点的角度。然后循环遍历扇形面的顶点,对于每个顶点,计算出其对应的角度,通过 Vector2.Dot 方法判断该点是否在射线照射范围内,将射线检测到的扇形面的颜色设置为绿色,未检测到的设置为红色。最后,将扇形面中心的颜色设置为黄色。如果射线没有击中物体,则将所有扇形面的颜色重置为红色。最后,通过 mesh.RecalculateNormals() 重新计算法线,以确保扇形面的光照效果正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值