在 Unity 中,我需要将 CharacterController 从 v2 移动到 v3。我有以下信息:圆的中心点 (v1);圆外的当前角色位置 (v2);角度 (a)。如何计算 CharacterController 的移动向量,使其从 v2 移动到 v3?
我创建了一个名为 ScorePopup 的简单预制件。它有一个TextMeshPro
组件。它还有一个Animator
将文本向上移动 2 个世界单位并在 1 秒内淡出颜色的组件。因此在动画器中,它有
ScorePopup: Text Mesh Pro.Font Color - goes from 1 to 0 over 1 second.
ScorePopup: Anchored Position
Anchored Position.x (stays at 0)
Anchored Position.y - goes from 0 to 2 over 1 second.
现在,想象一下这样一个游戏,敌人从右向左移动。它被子弹击中。我想在敌人被击中的位置实例化这个 ScorePopup。
我尝试在我的游戏脚本中实例化它:
GameObject go = Instantiate(scorePopupPrefab, enemy.transform.position, Quaternion.identity);
go.GetComponent<TMP_Text>().text = score.ToString();
问题是 ScorePopup 没有出现在敌人的位置 - 它出现在我的场景中的 0,0,大概是因为Anchored Position
动画中的值。
因此我尝试在敌人脚本中实例化 ScorePopup:
GameObject go = Instantiate(scorePopupPrefab, transform.position, Quaternion.identity, transform);
这样可以正确地将分数弹出窗口置于敌人所在的位置。但是,分数弹出窗口会随敌人向左移动。我希望分数弹出窗口出现在场景/世界空间中的打击位置并在那里执行动画。它不应该随敌人移动。
这里的解决方案是什么?如果预制件具有内部位置动画,如何在场景中的指定位置实例化预制件?这是针对非常常见的情况,当玩家通过击打或获得物体获得积分时,您会看到分数向上浮动。
编辑:文本预制件没有画布。它被创建为一个空对象,并TMPRo - Text
添加了一个组件(和一个动画器)来显示文本。
我也尝试过这个:
public class ScorePopup : MonoBehaviour
{
private Animator animator;
void Awake()
{
animator = GetComponent<Animator>();
if (animator != null)
{
animator.enabled = false;
StartCoroutine(EnableAnimatorAfterDelay(0.1f));
}
}
IEnumerator EnableAnimatorAfterDelay(float delay)
{
yield return new WaitForSeconds(delay);
animator.enabled = true;
}
}
它会短暂地出现在正确的位置,但当动画启用时它会移动到 0,0 :(
我有一段代码:
foreach (DynamicBuffer<Items> items in SystemAPI.Query<DynamicBuffer<Items>>())
{
...
}
我正在尝试修改 的特定元素items
。以下是我尝试实现此目的的方法:
items[3] = modifiedItem;
但我得到了错误
无法修改“items”的成员,因为它是“foreach 迭代变量”。
我怎样才能修改的元素items
?
我制作了一些额外的动画剪辑,它们的存在导致玩家无法移动。我不知道为什么,当我删除新的动画剪辑时,我可以再次移动玩家。我尝试撤消代码以查看是否是代码问题,但事实并非如此。
我试图平稳地将物体从 a 点移动到 b 点:
Instantiate(cat, OffScreenLeft(), Quaternion.identity);
Debug.Log("start position: " + OffScreenLeft());
Debug.Log("end position: " + InPosition());
StartCoroutine(MoveFromTo(cat.transform, OffScreenLeft(), InPosition(), 3f));
IEnumerator MoveFromTo(Transform objectToMove, Vector3 a, Vector3 b, float speed) {
float step = (speed / (a - b).magnitude) * Time.fixedDeltaTime;
float t = 0;
while (t <= 1.0f) {
t += step; // Goes from 0 to 1, incrementing by step each time
objectToMove.position = Vector3.Lerp(a, b, t); // Move objectToMove closer to b
yield return new WaitForFixedUpdate();
}
objectToMove.position = b;
Debug.Log("move complete cat: " + cat.transform.position);
}
这是调试输出:
start position: (-20.34, 4.33)
end position: (-8.67, 4.33)
move complete cat: (-8.67, 4.33, 0.00)
调试输出显示猫应该移动了。但它仍然出现在屏幕外,留在原来的位置。我遗漏了什么?
在协同程序中我设置了刚体的速度来跟随触摸屏的位置:
rb.velocity = direction * touchDragPhysicsSpeed;
但我还想让它的旋转趋向于零度。我该怎么做?
人工智能一直告诉我做这样的事情:
Quaternion targetRotation = Quaternion.Euler(Vector3.zero);
rb.MoveRotation(Quaternion.Slerp(rb.rotation, targetRotation, rotationCorrectionSpeed));
但是 MoveRotation 行给出了错误:
参数 1:无法从“float”转换为“UnityEngine.Quaternion”
这是正确的方法吗?如果是这样,我该如何修复错误?或者有更好的方法吗?
以下代码用于单击并拖动对象:
private void MousePressed(InputAction.CallbackContext context)
{
Vector2 mousePosition = Input.mousePosition;
Vector3 worldPosition = mainCamera.ScreenToWorldPoint(new Vector3(mousePosition.x, mousePosition.y, -mainCamera.transform.position.z));
worldPosition.z = 0;
Collider2D hitCollider = Physics2D.OverlapPoint(worldPosition);
if (hitCollider != null)
{
StartCoroutine(DragUpdate(hitCollider.gameObject));
}
}
private IEnumerator DragUpdate(GameObject clickedObject)
{
float initialDistance = Vector3.Distance(clickedObject.transform.position, mainCamera.transform.position);
clickedObject.TryGetComponent<Rigidbody2D>(out var rb);
while (mouseClick.ReadValue<float>() != 0) {
Ray ray = mainCamera.ScreenPointToRay(Mouse.current.position.ReadValue());
if (rb != null) {
Vector3 direction = ray.GetPoint(initialDistance) - clickedObject.transform.position;
rb.velocity = direction * mouseDragPhysicsSpeed;
yield return waitForFixedUpdate;
} else {
clickedObject.transform.position = Vector2.SmoothDamp(clickedObject.transform.position, ray.GetPoint(initialDistance), ref velocity, mouseDragSpeed);
yield return null;
}
}
}
问题是对象首先移动,使其中心位于光标上。如何保留初始偏移量,以便光标相对于对象的位置与第一次开始拖动时的位置相同?
我愿意接受任何改进此代码的建议 - 我是 Unity/C# 的新手。谢谢!
我正在制作多人游戏,并在代码中制作拾取和放下物品。我遇到了一个错误,在我为 player 添加子级并添加另一个子级后,player.transform.childCount 返回 3。
我尝试添加一些 debug.log,输出在客户端“3:1”和“3”,在主机端输出“4:0”,因此在主机端一切正常,但在客户端它返回了错误的值
感谢任何答案
public void AddItem(ItemData itemData)
{
if(itemData == null)
return;
this.itemData = itemData;
icon.sprite = itemData.icon;
icon.enabled = true;
if (player == null)
player = NetworkManager.Singleton.SpawnManager.GetLocalPlayerObject().gameObject;
if (player != null)
{
NetworkObject networkObject = player.GetComponent<NetworkObject>();
if (networkObject != null)
{
Debug.Log(player.transform.childCount + ": 1");
AddItemToHandServerRpc(itemData.index, networkObject.NetworkObjectId);
Debug.Log(player.transform.childCount);
if (player.transform.childCount == 4)
{
GameObject item = player.transform.GetChild(player.transform.childCount - 1).gameObject;
item.GetComponent<SetPossionToHand>().enabled = true;
item.transform.localScale = new Vector3(.01f, .01f, .01f);
}
else
{
Debug.Log("fsjfhshuyferh");
}
}
else
Debug.Log("none");
}
else
{
Debug.LogError("Hand object is not properly initialized or is disabled.");
}
}
public void ClearSlot(bool delete)
{
itemData = null;
icon.sprite = null;
icon.enabled = false;
if (player.transform.childCount == 4 && delete)
{
if (player == null)
player = NetworkManager.Singleton.SpawnManager.GetLocalPlayerObject().gameObject;
GameObject item = player.transform.GetChild(player.transform.childCount - 1).gameObject;
DespawnObjectServerRpc(item.GetComponent<NetworkObject>().NetworkObjectId);
}
}
[ServerRpc]
void AddItemToHandServerRpc(int index, ulong handId)
{
GameObject item = list.prefabs[index];
var instance = Instantiate(item);
var instanceNetworkObject = instance.GetComponent<NetworkObject>();
Transform player = NetworkManager.Singleton.SpawnManager.SpawnedObjects[handId].gameObject.transform;
instanceNetworkObject.SpawnWithOwnership(handId);
instanceNetworkObject.TrySetParent(player, false);
Debug.Log(player.transform.childCount + ": 0");
}
客户端:
主办方方面: