开始之前:(这是基础立方体)
开始后:(应该是一只眼睛(即一个球))
改造木桌:
编码:
成分资产:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "New Ingredient", menuName = "Ingredient")]
public class IngredientAsset : ScriptableObject {
public Mesh ingredientMesh;
}
成分:
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class Ingredient : MonoBehaviour {
public IngredientAsset asset;
public Ingredient (IngredientAsset a) {
asset = a;
}
public bool HasIngrediend()
{
if (asset == null) {
return false;
} else {
return true;
}
}
public Mesh GetIngrediendMesh()
{
if (asset == null) {
return null;
}
return asset.ingredientMesh;
}
}
表框:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TableBox : MonoBehaviour {
public MeshFilter overlay;
public IngredientAsset ingredient;
public EquipmentAsset equipment;
private void Start()
{
if (ingredient!=null) {
overlay.mesh = ingredient.ingredientMesh;
} else if (equipment != null) {
overlay.mesh = equipment.equipmentMesh;
}
}
public void Interact(IngredientAsset c, EquipmentAsset t, PlayerInteraction player)
{
player.SetIngredient(ingredient);
ingredient = c;
player.SetEquipment(equipment);
equipment = t;
if (equipment != null)
overlay.mesh = equipment.equipmentMesh;
else if (ingredient != null)
overlay.mesh = ingredient.ingredientMesh;
else
overlay.mesh = null;
}
}
玩家互动:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerInteraction : MonoBehaviour {
public GameObject target;
public KeyCode interactKey;
[SerializeField]
private IngredientAsset ingredient;
[SerializeField]
private EquipmentAsset equipment;
private void Update()
{
if (Input.GetKeyDown(interactKey))
{
if (target == null)
return;
TableBox table = target.GetComponent<TableBox>();
if (table != null)
{
table.Interact(ingredient, equipment, this);
}
}
}
public void SetIngredient(IngredientAsset c)
{
ingredient = c;
}
public void SetEquipment(EquipmentAsset t)
{
equipment = t;
}
private void OnTriggerEnter(Collider col)
{
if (target != col.gameObject && target != null)
{
Deselect();
}
target = col.gameObject;
}
}
private void OnTriggerExit(Collider col)
{
if (col.gameObject == target)
{
Deselect();
target = null;
}
}
void Deselect()
{
}
}
我的项目。
PS我的网格,与预制不同,是“裸露的”,如何将对象的其余组件从预制添加到网格中?(纹理、碰撞器等)
感谢您的关注!



问题源于对transform值的变换如何在父子关系中起作用的误解。
让我们在真空中举个例子:
该问题假设层次结构中的“底部”子级将具有
Scale = (1, 1, 1),这是绝对错误的。本地的Scale将等于(1, 1, 1),但全局Scale的将等于(0.5 * 0.25 * 1, 0.5 * 0.25 * 1, 0.5 * 0.25 * 1)。事实上,这里使用了矩阵,但我们不会用这个来重载问题,在矩阵乘法之后,我们将得到与我上面写的相同的结果。
我们从问题来看情况:
结果,经过所有矩阵变换后的世界
Scale对象Overlay将等于:(0.7, 0.7, 0.1),当“眼睛”网格显然应该具有 时Scale = (1, 1, 1)。您可以通过 2 种方式解决问题:
要更改
Scale对象Overlay以使其与Scale层次结构中的 'th 较高的对象具有相反的效果,在这种情况下,您需要设置以下值:有一种方法可以做到这一点,但在这里我们遇到了各种讨厌的舍入和类型限制
float。是的,而且您每次都必须手动设置所有这些,这很不方便、乏味并且会导致错误。最初,请注意层次结构中的
Scale'th 和其他组件Transform。在这种情况下,我认为最简单的方法是这样做:那些。简单地分为具有尺度 (1, 1, 1) 的“两个阵营”对象和具有一些奇异尺度的对象。
与 Transform.position 的情况完全相同,只是在那里发生了加法而不是矩阵乘法。如果你仔细观察,你的会
Overlay沿着轴移动Z,4.63这导致了沿着轴的移动Z。