Unity - 官方2D反向动力学 (2D IK) 文档

本文由 祝你万事顺利 出品,转载请注明出处。

官方英文文档

简介

2D Inverse Kinematics包可以让我们将2D IK应用到骨骼和角色的骨骼动画中。2D IK将自动计算移动到目标位置骨骼的移动和旋转。这样我们可以更加容易地摆出姿势和角色的四肢,或实时的操纵骨骼,不再需要关键帧。

工作流

笔者使用的是Unity2019.3 Beta,在此版本中2D IK 在Package Manager中属于Preview Package,直接打开Package Manager找不到2D IK。需要点击 Advanced>Preview Packages
在这里插入图片描述
以下工作流将继续2D Animation的工作流,并将2D IK应用到我们的角色骨骼中。
1.使用Sprite Editor创建骨骼
2.给游戏物体添加IK Manager 2D组件。通常这个组件添加在根节点
3.在IK Manager 2D中点击’+'号,添加IK Solvers,IK Solvers将添加一个额外的游戏物体。
4.选中IK Solver,选择Effector,将骨骼添加进去,点击下面的CreateTarget生成一个Target
5.调整Target位置,移动Target骨骼链将随之移动。

IK Solvers

IK Solvers将计算为了达到Target position,Effector的位置和角度和其连接的骨骼的位置和角度。每种IK Solver有自己的算法。

PropertyDescription
Effector默认的骨骼或IK Solver 的位置
Target指定Effector的目标位置
Constrain Rotation约束旋转的程度
Restore Default Pose启用此选项可将骨骼恢复到应用2D IK之前的原始位置。 禁用与效果器当前位置和旋转有关的2D IK。
Weight调整IK Solver对原始Transform的影响程度
Chain LengthIK影响骨骼链中的数量
Iterations算法的运行次数
Tolerance指定Effector的目标位置,,何时IK Solver 停止iterating
IK Manager 2D

IK Manager 2D组件控制IK Solvers。在根节点添加此组件。
1.在根节点添加Manager
在这里插入图片描述
2.添加IK Solver
在这里插入图片描述
3.根据不同的算法生成IK Solver
在这里插入图片描述
IK Solver在上面的顺序中降序遍历,此顺序一般根据骨骼在组织上的形式进行排序。
比如胳膊是躯干的一个子物体,那么IK顺序应该是 IK Solver在arm Solver之上。

Weight

IK Manager 2D中的Weight控制全部的Solvers对骨骼的影响程度

创建一个Target

再创建一个IK Solver后,通过Create Target创建于给Target。Target将反应Effector尝试去到达的位置。在Effector朝着Target Pos移动的时候,IK Solver将计算Effector的旋转和其连接的骨骼的旋转。

API

可以通过代码继承Solver2D类来实现自己的solver。拓展的类将作为一个新的solver显示在IKManager2D的组件中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里提供一种简易的Unity-2D随机生成地图及障碍物的方法: 1. 创建一个空物体,命名为MapGenerator,将其挂载一个脚本MapGenerator.cs。 2. 在脚本中定义一些公共变量,如地图大小、障碍物数量、障碍物大小等。 3. 在Start()方法中,使用循环生成地图和障碍物。可以使用随机数来生成地图和障碍物的位置和大小。 4. 生成地图时,可以使用Tilemap组件来创建砖块地图。可以使用Tile Palette工具来创建不同的砖块,并在脚本中随机选择一些砖块来生成地图。 5. 生成障碍物时,可以使用SpriteRenderer组件来创建障碍物。可以使用多个Sprite来创建不同的障碍物,并在脚本中随机选择一些Sprite来生成障碍物。 6. 最后,将生成的地图和障碍物放置在MapGenerator物体下,并运行游戏即可。 下面是MapGenerator.cs的代码示例: ``` using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Tilemaps; public class MapGenerator : MonoBehaviour { public int mapWidth = 100; public int mapHeight = 100; public int obstacleCount = 20; public float obstacleSize = 1f; public Tilemap tilemap; public TileBase[] tiles; public Sprite[] obstacles; // Start is called before the first frame update void Start() { GenerateMap(); GenerateObstacles(); } void GenerateMap() { for (int x = 0; x < mapWidth; x++) { for (int y = 0; y < mapHeight; y++) { tilemap.SetTile(new Vector3Int(x, y, 0), tiles[Random.Range(0, tiles.Length)]); } } } void GenerateObstacles() { for (int i = 0; i < obstacleCount; i++) { GameObject obstacle = new GameObject("Obstacle"); obstacle.transform.parent = transform; SpriteRenderer sr = obstacle.AddComponent<SpriteRenderer>(); sr.sprite = obstacles[Random.Range(0, obstacles.Length)]; float size = Random.Range(obstacleSize / 2f, obstacleSize); obstacle.transform.localScale = new Vector3(size, size, 1f); float x = Random.Range(0f, mapWidth); float y = Random.Range(0f, mapHeight); obstacle.transform.position = new Vector3(x, y, 0f); } } } ``` 在这个示例中,我们使用了Tilemap组件来生成地图,并使用了SpriteRenderer组件来生成障碍物。你可以根据自己的需求来修改代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值