最近因为要做一个小游戏,要实现用代码创建无限向上延伸的旋转楼梯效果,找遍了网上的逻辑都未曾实现,于是乎自己实现了一个,这里记录一下。有需要的朋友拿走不谢~
效果图:
直接上代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum StairsDir
{
X,
Z
}
public class StairsManager : MonoBehaviour
{
public GameObject cube;
StairsDir stairsDir;
int yPos = 0;
private void Start()
{
//这里的for循环即可控制旋转楼梯需要往上延伸多高
for (int i = 0; i < 4; i++)
{
CreateOneCircleStairs();
}
}
//这里是楼梯旋转一圈的逻辑
public void CreateOneCircleStairs()
{
CreateGroupStairs(StairsDir.X, 0.5f, 10, 1, new Vector3(0, yPos * 5, 0));
yPos += 1;
CreateGroupStairs(StairsDir.Z, 0.5f, 10, 1, new Vector3(9, yPos * 5, 1));
yPos += 1;
CreateGroupStairs(StairsDir.X, 0.5f, 10, -1, new Vector3(8, yPos * 5, 10));
yPos += 1;
CreateGroupStairs(StairsDir.Z, 0.5f, 10, -1, new Vector3(-1, yPos * 5, 9));
yPos += 1;
}
//这里返回列表,是为了能够获取当前一小段楼梯的所有实例化的物体的引用
public List<GameObject> CreateGroupStairs(StairsDir stairsDir, float gap,int count,int dir , Vector3 startCreatePos) {
List<GameObject> groupStairs = new List<GameObject>();
for (int i = 0; i < count; i++)
{
GameObject ccc = (GameObject)Instantiate(cube);
switch (stairsDir)
{
case StairsDir.X:
ccc.transform.position = new Vector3(i * dir, i * gap, 0)+startCreatePos;
break;
case StairsDir.Z:
ccc.transform.position = new Vector3(0, i * gap, i * dir) + startCreatePos;
break;
}
groupStairs.Add(ccc);
}
return groupStairs;
}
}
直接把此代码放到任何一个空物体上,然后拖入单个楼梯预制体。当然咯,里面的参数需要根据你项目的楼梯尺寸进行改变,大体逻辑是这样的。不过这里我没有考虑性能的问题,大家可以自行修改!