【发布时间】:2021-09-28 10:42:24
【问题描述】:
对于我正在尝试做的游戏,我有很多对象:
一切都从特定的精灵开始,比如英雄:
除了 Hero 是唯一一个拥有Animator 组件并遵循动画状态的人。
其他游戏对象将使用以下脚本根据英雄获取它们的精灵和位置:
using UnityEngine;
public class SpritePosition : MonoBehaviour {
[SerializeField] private string objectName;
[SerializeField] private int objectIndex;
[SerializeField] private int objectR;
[SerializeField] private int objectG;
[SerializeField] private int objectB;
private Rigidbody2D body;
private SpriteRenderer objectRenderer;
private GameObject hero;
private Rigidbody2D heroRigidBody;
private SpriteRenderer heroRenderer;
private Sprite currentHeroSprite;
private HeroResources heroResourcesScript;
private HeroMovement heroMovementScript;
private Sprite[] spriteGroup;
private void Start() {
body = GetComponent<Rigidbody2D>();
objectRenderer = GetComponent<SpriteRenderer>();
hero = GameObject.Find("Hero");
heroRigidBody = hero.GetComponent<Rigidbody2D>();
heroRenderer = hero.GetComponent<SpriteRenderer>();
currentHeroSprite = heroRenderer.sprite;
heroResourcesScript = hero.GetComponent<HeroResources>();
Debug.Log(objectName + "(" + objectR + ", " + objectG + ", " + objectB + ")");
spriteGroup = heroResourcesScript.spriteGroup[objectName];
}
private void Update() {
heroMovementScript = hero.GetComponent<HeroMovement>();
if (currentHeroSprite != heroRenderer.sprite) {
currentHeroSprite = heroRenderer.sprite;
}
SetSprite();
SetPosition();
}
private bool shouldMirrorSprite(int index) {
return index >= 0 && index <= 34 ||
index >= 69 && index <= 71 ||
index >= 81 && index <= 83 ||
index >= 97 && index <= 99 ||
index >= 117 && index <= 118 ||
index >= 133 && index <= 175;
}
private void SetSprite() {
int currentSpriteIndex = int.Parse(currentHeroSprite.name.Replace("hero-body_", ""));
objectRenderer.sprite = spriteGroup[currentSpriteIndex];
objectRenderer.color = new Color32((byte)objectR, (byte)objectG, (byte)objectB, 255);
if (heroMovementScript.isFacingLeft && shouldMirrorSprite(currentSpriteIndex)) {
transform.localScale = new Vector3(-1, 1, 1);
} else {
transform.localScale = Vector3.one;
}
}
// for this to work, the game object must have a
// RigidBody2D component with Freeze Position active
// for X and Y axis
private void SetPosition() {
Vector2 currentHeroPosition = heroRigidBody.position;
transform.position = currentHeroPosition;
}
}
当作为组件添加时,需要名称、索引以及 R、G 和 B 值:
这里,Name 是为每个游戏对象加载特定精灵所必需的,在此脚本中:
using System.Collections.Generic;
using UnityEngine;
public class HeroResources : MonoBehaviour
{
public Dictionary<string, Sprite[]> spriteGroup = new Dictionary<string, Sprite[]>();
void Awake () {
spriteGroup.Add("pants", Resources.LoadAll<Sprite>("Spritesheets/pants"));
spriteGroup.Add("boots", Resources.LoadAll<Sprite>("Spritesheets/boots"));
spriteGroup.Add("shirt", Resources.LoadAll<Sprite>("Spritesheets/shirt"));
spriteGroup.Add("tunic", Resources.LoadAll<Sprite>("Spritesheets/tunic"));
spriteGroup.Add("belt", Resources.LoadAll<Sprite>("Spritesheets/belt"));
Debug.Log(spriteGroup.Count);
}
}
精灵是从Resources文件夹中的几个文件夹加载的:
这些 spritesheet 的大小都相同,因此可以干净利落地切割:
因此,有了这样的精灵,我可以简单地调用基于英雄的SetSprite 函数和SetPosition 函数:
private void SetSprite() {
int currentSpriteIndex = int.Parse(currentHeroSprite.name.Replace("hero-body_", ""));
objectRenderer.sprite = spriteGroup[currentSpriteIndex];
objectRenderer.color = new Color32((byte)objectR, (byte)objectG, (byte)objectB, 255);
if (heroMovementScript.isFacingLeft && shouldMirrorSprite(currentSpriteIndex)) {
transform.localScale = new Vector3(-1, 1, 1);
} else {
transform.localScale = Vector3.one;
}
}
// for this to work, the game object must have a
// RigidBody2D component with Freeze Position active
// for X and Y axis
private void SetPosition() {
Vector2 currentHeroPosition = heroRigidBody.position;
transform.position = currentHeroPosition;
}
这样可行,其他精灵会根据英雄游戏对象的索引更新并跟随它,所以看起来用户有很多装备。但是,有时精灵要么跟不上,要么位置有点落后:
精灵顶部似乎还有一些黑线。我认为这是因为精灵加载速度不够快,如果是这样,有没有办法确保这些精灵加载得更快?还是这与计算机的性能有关?
另外,为了让精灵跟随,我需要在其他游戏对象的 RigidBody2D 上冻结 X 和 Y 位置。 Hero 有 Transform、Sprite Renderer、Box Collider 2D、RigidBody2D、两个脚本(HeroMovement 和 HeroResources)和 Animator 组件,而其他游戏对象只有 Transform、Sprite Renderer、RigidBody2D 和一个脚本(SpritePosition)
【问题讨论】:
标签: unity3d