84 lines
2.7 KiB
C#
84 lines
2.7 KiB
C#
using UnityEngine;
|
|
|
|
public class ResourceManager : MonoBehaviour
|
|
{
|
|
public GameObject LoadModel(int id)
|
|
{
|
|
GameObject characterContainer = new GameObject($"CharLoaded_{id:X4}");
|
|
|
|
GameObject mesh = GameObject.CreatePrimitive(PrimitiveType.Cube);
|
|
mesh.transform.SetParent(characterContainer.transform);
|
|
|
|
BoxCollider boxCollider = mesh.GetComponent<BoxCollider>();
|
|
if (boxCollider != null)
|
|
{
|
|
GameObject.Destroy(boxCollider);
|
|
}
|
|
|
|
float height = id == 1 ? 150f : 60f;
|
|
mesh.transform.localScale = new Vector3(30f, height, 30f);
|
|
|
|
// 5. Ïîäíèìàåì âèçóàëüíóþ ÷àñòü íà ïîëîâèíó âûñîòû
|
|
mesh.transform.localPosition = new Vector3(0, height / 2f, 0);
|
|
|
|
// 6. Äîáàâëÿåì êîëëàéäåð è êîíòðîëëåð ÊÎÍÒÅÉÍÅÐÓ, à íå âèçóàëüíîé ÷àñòè
|
|
CapsuleCollider capsuleCollider = characterContainer.AddComponent<CapsuleCollider>();
|
|
capsuleCollider.height = height;
|
|
capsuleCollider.radius = 50f;
|
|
capsuleCollider.center = new Vector3(0, height / 2f, 0); // Öåíòð íà ïîëîâèíå âûñîòû
|
|
|
|
characterContainer.AddComponent<CharacterController>();
|
|
|
|
return characterContainer;
|
|
}
|
|
|
|
public static int ConvertGameCoordinate(uint gameCoord)
|
|
{
|
|
int value30bit = (int)(gameCoord & 0x3FFFFFFF);
|
|
if ((gameCoord & 0x40000000) != 0)
|
|
{
|
|
return value30bit - 0x40000000;
|
|
}
|
|
else
|
|
{
|
|
return value30bit;
|
|
}
|
|
}
|
|
|
|
public static float ConvertGameRotation(uint gameRot)
|
|
{
|
|
return gameRot * 45f - 180f;
|
|
}
|
|
|
|
public GameObject CharLoad(int modelId)
|
|
{
|
|
GameObject obj = LoadModel(modelId);
|
|
obj.name = $"ModelTemplate_{modelId:X4}";
|
|
obj.SetActive(false);
|
|
return obj;
|
|
}
|
|
|
|
public GameObject CharInit(GameObject obj, int id, uint gameX, uint gameY, uint gameZ, uint gameRot)
|
|
{
|
|
GameObject characterInstance = Instantiate(obj);
|
|
|
|
var ctrl = characterInstance.GetComponent<CharacterController>();
|
|
ctrl.CharacterId = id;
|
|
characterInstance.name = $"{id:X4}"; //rename for normal script ID
|
|
float x = ConvertGameCoordinate(gameX);
|
|
float y = ConvertGameCoordinate(gameY);
|
|
float z = ConvertGameCoordinate(gameZ);
|
|
float rotation = ConvertGameRotation(gameRot);
|
|
|
|
characterInstance.transform.position = new Vector3(x, y, z);
|
|
characterInstance.transform.rotation = Quaternion.Euler(0, rotation, 0);
|
|
characterInstance.SetActive(true);
|
|
|
|
if (id == 1 && ControlsController.Instance != null)
|
|
{
|
|
ControlsController.Instance.SetControlledObject(characterInstance);
|
|
}
|
|
|
|
return characterInstance;
|
|
}
|
|
} |