프로젝트 제목에 소형 게임 만들기 - 사전 조립식 실례
10227 단어 ProjectTinydotsUnity
입문
Project Tiny에서 미니 게임을 제작할 때 사용하는 기능과 고장에 대해 설명합니다.
이번에는 게임 중의 예비 조립 실례 제작에 관한 실시이다.
저장소는 여기 입니다.
구현 방법
이 게임은 무작위로 장애물을 생성할 때 사용된다.
간단하게 말하자면, 우리는 예비 조립식 장애물로 몇 개의 실체를 준비했다
EntityManager.인스턴스를 Instantiate에서 작성하는 중입니다.
이후 장애물이 화면 밖에 있으면 삭제하는 것이 특별히 어려운 일은 없다.
하지만 이 실시 전에 우여곡절이 있었기 때문에 제가 설명해 드릴게요.
예제 "번식 및 설계"
PackageManager에서 얻을 수 있는 예는 "Spaen and Destroy"입니다.
[+] 버튼을 누르면 전투기의 간단한 내용이 배로 늘어난다.
처음에는 이것을 참고해서 실시했기 때문에 혼란스러웠는데...
"번식 및 설계" 구현
Hierarchy에 전투기 실체만 배치된 장면을 준비했습니다.
그 장면은 Scene Service입니다.LoadSceneAsync를 로드하여 인스턴스를 생성합니다.
삭제할 때 SceneService입니다.UnloadAllSceneInstances에서 동일한 장면의 모든 인스턴스를 삭제합니다.
이런 방법의 경우 실례를 만드는 것은 좋지만 삭제할 때 같은 장면의 물건을 삭제한다
불편해서 다른 방법을 찾기로 했어요.
EntityManager에서 인스턴스 만들기
검색하고 바로 나오는데...
Game Obejct의 Instatiate와 같이 사용하면 하고 싶은 일을 할 수 있을 것 같아서 여기에 설치하기로 했습니다.
다만, 이곳에서도 조립식 건물의 처리로 인해 약간 걸려 넘어졌다.
선행 어셈블리
ECS에 Prefab 구성 요소가 있습니다. 이를 사용하여 구현을 시도했습니다.
Prefab 어셈블리에 대한 자세한 내용은 F_ 참조선생님의 이 문장은 이해하기 쉽습니다.
질의 작성 옵션에서 EntityQueryOptions.IncludePrefab 지정
Prefab을 포함시키려 했지만 왠지 잘 얻지 못했습니다.
나는 많은 실체의 구성 요소 설정을 시도했지만 결국 순조롭지 못했고, 결국 아래에 소개한 방법으로 냉정해졌다.
최종 구현
우리는 장애물을 위해 Obstacle 구성 요소를 준비했고, 그 중에서 bool을 제공하여 그것이 예비 조립식인지 아닌지를 확인했다.
Obstacle.cspublic struct Obstacle : IComponentData {
public bool IsPrefab;
}
Hierarchy에서 Obstacle 구성 요소를 설정하고 IsPrefab를 실제 실체로 설정하는 몇 가지를 준비했습니다.
인스턴스 관리 시스템에서 NativeArray에 IsPrefab을 실제 실체로 사전 제작
인스턴스를 만들 때 IsPrefab을 false로 설정하여 동일한 Obstacle 구성 요소라도
사전 제작 부품인지 인스턴스인지 확인할 수 있습니다.
SpawnAndDestroyObstacleSystem.csvar prefabs = new NativeArray<Entity>(4, Allocator.Temp);
var count = 0;
// プレハブの取得
Entities.ForEach((Entity obstacleEntity, ref Obstacle obstacleComponent) => {
if (obstacleComponent.IsPrefab) {
prefabs[count] = obstacleEntity;
++count;
}
});
// インスタンス作成
var spawnObstacle = EntityManager.Instantiate(prefabs[_random.NextInt(prefabs.Length)]);
var translation = EntityManager.GetComponentData<Translation>(spawnObstacle);
if (existObstacleCount == 0) {
translation.Value = lastObstaclePos;
}
else {
var speedScale = 1.0f;
Entities.ForEach((ref GameState game) => {
speedScale = game.SpeedScale;
});
var offset = 0.0f;
if(speedScale < 1.75f) {
offset = _random.NextFloat(7.5f, 10.0f);
}
else {
offset = _random.NextFloat(10.0f, 12.5f);
}
translation.Value = new float3(lastObstaclePos.x + offset, 0.0f, 0.0f);
}
EntityManager.SetComponentData(spawnObstacle, translation);
// 座標の設定等
var scroll = EntityManager.GetComponentData<Scroll>(spawnObstacle);
var startPos = translation.Value;
scroll.StartPosition = new float2(startPos.x, startPos.y);
scroll.Distance = 100.0f + startPos.x;
scroll.Enable = true;
lastObstaclePos = startPos;
EntityManager.SetComponentData(spawnObstacle, scroll);
var obstacle = EntityManager.GetComponentData<Obstacle>(spawnObstacle);
// IsPrefabをfalseにしてインスタンスしたEntityとして扱う
obstacle.IsPrefab = false;
EntityManager.SetComponentData(spawnObstacle, obstacle);
prefabs.Dispose();
Reference
이 문제에 관하여(프로젝트 제목에 소형 게임 만들기 - 사전 조립식 실례), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/chocolate-ice-cream/items/8e71558887047e307b85
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
public struct Obstacle : IComponentData {
public bool IsPrefab;
}
var prefabs = new NativeArray<Entity>(4, Allocator.Temp);
var count = 0;
// プレハブの取得
Entities.ForEach((Entity obstacleEntity, ref Obstacle obstacleComponent) => {
if (obstacleComponent.IsPrefab) {
prefabs[count] = obstacleEntity;
++count;
}
});
// インスタンス作成
var spawnObstacle = EntityManager.Instantiate(prefabs[_random.NextInt(prefabs.Length)]);
var translation = EntityManager.GetComponentData<Translation>(spawnObstacle);
if (existObstacleCount == 0) {
translation.Value = lastObstaclePos;
}
else {
var speedScale = 1.0f;
Entities.ForEach((ref GameState game) => {
speedScale = game.SpeedScale;
});
var offset = 0.0f;
if(speedScale < 1.75f) {
offset = _random.NextFloat(7.5f, 10.0f);
}
else {
offset = _random.NextFloat(10.0f, 12.5f);
}
translation.Value = new float3(lastObstaclePos.x + offset, 0.0f, 0.0f);
}
EntityManager.SetComponentData(spawnObstacle, translation);
// 座標の設定等
var scroll = EntityManager.GetComponentData<Scroll>(spawnObstacle);
var startPos = translation.Value;
scroll.StartPosition = new float2(startPos.x, startPos.y);
scroll.Distance = 100.0f + startPos.x;
scroll.Enable = true;
lastObstaclePos = startPos;
EntityManager.SetComponentData(spawnObstacle, scroll);
var obstacle = EntityManager.GetComponentData<Obstacle>(spawnObstacle);
// IsPrefabをfalseにしてインスタンスしたEntityとして扱う
obstacle.IsPrefab = false;
EntityManager.SetComponentData(spawnObstacle, obstacle);
prefabs.Dispose();
Reference
이 문제에 관하여(프로젝트 제목에 소형 게임 만들기 - 사전 조립식 실례), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/chocolate-ice-cream/items/8e71558887047e307b85텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)