有 2 个在搅拌机中制作并导入 Unity 的对象。
问题是在使用了应该在手臂-身体区域创建一个项目的代码之后(我仍在研究这个),一个项目是在远离角色的地方创建的。
代码:
PlayerInteraction:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerInteraction : MonoBehaviour
{
public GameObject target = null;
public KeyCode interactKey;
public GameObject itemHolder;
private void Update()
{
if (Input.GetKeyDown(interactKey))
{
if (target == null)
{
return;
}
FoodBox food = target.GetComponent<FoodBox>();
if (food != null && itemHolder == null)
{
food.Interact(this);
}
TableBox table = target.GetComponent<TableBox>();
if (table != null)
{
table.Interact(itemHolder, this);
}
}
}
public void SetItem(GameObject c)
{
if (c != null)
{
Debug.Log("Взяли предмет!");
itemHolder = Instantiate(c, transform.position + new Vector3(0f, 2.15f, -0.65f), Quaternion.Euler(-90f, 0f, 180f), transform);
}
else
{
Destroy(itemHolder);
}
}
private void OnTriggerEnter(Collider col)
{
if (target != col.gameObject && target != null)
{
return;
}
else {
target = col.gameObject;
Debug.Log("Мы дошли сюда до " + target.name);
}
}
private void OnTriggerExit(Collider col)
{
if (col.gameObject == target)
{
target = null;
}
}
}
表框:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TableBox : MonoBehaviour
{
public GameObject itemHolder;
private void Start()
{
if (itemHolder != null)
{
itemHolder = Instantiate(itemHolder, transform.position + new Vector3(0f, 1.9f, 0f), Quaternion.Euler(-90f, 45f, 0f),transform);
Debug.Log("Мы создались!!");
}
}
public void Interact(GameObject i, PlayerInteraction player)
{
if ((i == null || itemHolder == null))
{
player.SetItem(this.itemHolder);
Destroy(this.itemHolder);
//Debug.Log(itemHolder);
this.itemHolder = i;
if (this.itemHolder != null)
{
this.itemHolder = Instantiate(this.itemHolder, transform.position + new Vector3(0f, 1.9f, 0f), Quaternion.Euler(-90f, 0f, -135f),transform);
Debug.Log("Мы ингридиенты из ТейблБокса!");
}
}
else
{
return;
}
}
}
食品盒:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FoodBox : MonoBehaviour
{
public GameObject ingredient;
private Animator anim;
// Use this for initialization
void Start()
{
anim = GetComponent<Animator>();
anim.SetBool("openFoodBox",false);
}
public void Interact(PlayerInteraction player)
{
anim.SetBool("openFoodBox", true);
if (anim.GetBool("openFoodBox")) {
anim.Play("Opening");
player.SetItem(ingredient);
Debug.Log("Мы ингридиенты из ФудБокса!");
}
anim.SetBool("openFoodBox",false);
}
}
还有一个假设是这是由于模型的初始位置。因为我有一些模型是垂直保存的,有些是水平放置的。
我还添加了一个预制检查器:







答案来自游戏开发线程,如下所示。
像往常一样,回答“为什么 Unity 会做这种花哨的事情?”这个问题的答案。听起来像“Unity 用你提供的精美数据做了一件非常正常的事情”
在这种情况下,Blender 中烧瓶的原点远离对象本身,下图中蓝色和红色箭头相交:
当网格导入 Unity 时,该点成为本地 (0, 0, 0) 点。
为了让对象位于您想要的位置,您必须在对象的位置上添加一个显着的垂直偏移量(+ new Vector3(0f, 1.9f, 0f) 在您的代码中)以将该原点置于您的角色上方,以便可见的网格在它下面,它会在你想要的地方排列。
Но когда вы создаёте объект с началом координат в более ожидаемой позиции всё по другому - начало координат вашего объекта Eye of Cyclop находится в его центре - в результате видимый меш сидит выше, чем вы хотите.
Таким образом, лучшее решение - это моделировать ваши объекты с началом координат в стандартизированном месте относительно видимого меша (скажем, вокруг его центра массы или у его основания). Посмотрите, как изменить начало координат объекта в Blender здесь.
Если по какой-либо причине исправить исходный меш не представляется возможным, вы также можете обернуть его в пустой родительский игровой объект и перемещать дочерний меш до тех пор, пока он не окажется в нужном вам месте относительно источника родителя. Затем создайте и управляйте родителем, а не мешем напрямую.