Search Unity

Question [NETWORK BEHAVIOR WITH FISHNET] HOW GET PLAYER MESH FROM PLAYER PREFAB

Discussion in 'Getting Started' started by rafhaelxd, Feb 17, 2024.

  1. rafhaelxd

    rafhaelxd

    Joined:
    Oct 1, 2022
    Posts:
    2
    Hey everyone,

    I could really use some assistance with configuring my playerPickUp script. I've managed to get everything else working perfectly, but I'm encountering a small issue that's been giving me trouble. I've tried several approaches, but being relatively new to game development with Unity, I'm struggling to resolve it. Can anyone lend a hand?

    So, in my playerPickUp.cs script, we have the ability to configure the position from which an object should be held when picked up. What I'm aiming to achieve is to obtain a mesh from my player prefab and then adjust the transform offset of that mesh to correctly position it in either the left or right hand.

    View attachment 1372727
    I want in pickUp position be able to set an mesh and change offsets, from player prefab -> object -> meshs
    View attachment 1372730

    I have tryied to get from objec tusing this cs script.

    Code (CSharp):
    1. private Transform FindBodyMeshInPlayerPrefab()
    2. {
    3.     GameObject playerPrefabInstance = Instantiate(playerPrefab); // Cria uma instância temporária do prefab do jogador
    4.     Transform bodyMesh = playerPrefabInstance.transform.Find("HumanMale/Mesh/Body/Hands");
    5.  
    6.     if (bodyMesh == null)
    7.     {
    8.         Debug.LogError("Body mesh not found in player prefab!");
    9.     }
    10.  
    11.     Destroy(playerPrefabInstance); // Destroi a instância temporária
    12.     return bodyMesh;
    13. }
    This is my Full PlayerPickup Current working with problems in position version.

    Code (CSharp):
    1.  
    2.  
    3. using System.Collections;
    4. using System.Collections.Generic;
    5. using UnityEngine;
    6. using FishNet.Object;
    7.  
    8. // Script para permitir que o jogador pegue e solte objetos
    9. public class PlayerPickup : NetworkBehaviour
    10. {
    11.     [Header("Settings")]
    12.     [SerializeField] private float raycastDistance;
    13.     [SerializeField] private LayerMask pickupLayer;
    14.     [SerializeField] private Transform pickupPosition;
    15.     [SerializeField] private Vector3 pickupOffset; // Offset para ajustar a posição de pegar em relação ao transformador pickupPosition
    16.     [SerializeField] private KeyCode pickupButton = KeyCode.E;
    17.     [SerializeField] private KeyCode dropButton = KeyCode.Q;
    18.  
    19.     private Camera cam;
    20.     private bool hasObjectInHand;
    21.     private GameObject objInHand;
    22.     private Transform worldObjectHolder;
    23.  
    24.     public override void OnStartClient()
    25.     {
    26.         base.OnStartClient();
    27.  
    28.         // Se não for o dono deste objeto, desativa este script
    29.         if (!base.IsOwner)
    30.             enabled = false;
    31.  
    32.         // Encontra a câmera principal e o objeto para segurar os objetos do mundo
    33.         cam = Camera.main;
    34.         worldObjectHolder = GameObject.FindGameObjectWithTag("WorldObjects").transform;
    35.     }
    36.  
    37.     private void Update()
    38.     {
    39.         // Verifica se o jogador pressionou o botão para pegar ou soltar
    40.         if (Input.GetKeyDown(pickupButton))
    41.             Pickup();
    42.  
    43.         if (Input.GetKeyDown(dropButton))
    44.             Drop();
    45.     }
    46.  
    47.     // Função para pegar objetos
    48.     private void Pickup()
    49.     {
    50.         // Lança um raio para frente da câmera para detectar objetos que podem ser pegos
    51.         if (Physics.Raycast(cam.transform.position, cam.transform.forward, out RaycastHit hit, raycastDistance, pickupLayer))
    52.         {
    53.             // Se o jogador não tiver um objeto na mão, pega o objeto atingido
    54.             if (!hasObjectInHand)
    55.             {
    56.                 // Calcula a posição final do objeto com base no offset
    57.                 Vector3 finalPosition = pickupPosition.position + pickupOffset;
    58.                 SetObjectInHandServer(hit.transform.gameObject, finalPosition, pickupPosition.rotation, gameObject);
    59.                 objInHand = hit.transform.gameObject;
    60.                 hasObjectInHand = true;
    61.             }
    62.             // Se o jogador já tiver um objeto na mão, solta o objeto atual e pega o novo objeto
    63.             else if (hasObjectInHand)
    64.             {
    65.                 Drop();
    66.  
    67.                 // Calcula a posição final do objeto com base no offset
    68.                 Vector3 finalPosition = pickupPosition.position + pickupOffset;
    69.                 SetObjectInHandServer(hit.transform.gameObject, finalPosition, pickupPosition.rotation, gameObject);
    70.                 objInHand = hit.transform.gameObject;
    71.                 hasObjectInHand = true;
    72.             }
    73.         }
    74.     }
    75.  
    76.     // Função para definir o objeto na mão do jogador no servidor
    77.     [ServerRpc(RequireOwnership = false)]
    78.     private void SetObjectInHandServer(GameObject obj, Vector3 position, Quaternion rotation, GameObject player)
    79.     {
    80.         SetObjectInHandObserver(obj, position, rotation, player);
    81.     }
    82.  
    83.     // Função para definir o objeto na mão do jogador nos observadores
    84.     [ObserversRpc]
    85.     private void SetObjectInHandObserver(GameObject obj, Vector3 position, Quaternion rotation, GameObject player)
    86.     {
    87.         obj.transform.position = position;
    88.         obj.transform.rotation = rotation;
    89.         obj.transform.parent = player.transform;
    90.  
    91.         // Desativa a física do objeto enquanto está na mão do jogador
    92.         if (obj.GetComponent<Rigidbody>() != null)
    93.             obj.GetComponent<Rigidbody>().isKinematic = true;
    94.     }
    95.  
    96.     // Função para soltar objetos
    97.     private void Drop()
    98.     {
    99.         // Verifica se o jogador tem um objeto na mão para soltar
    100.         if (!hasObjectInHand)
    101.             return;
    102.  
    103.         // Solta o objeto atual
    104.         DropObjectServer(objInHand, worldObjectHolder);
    105.         hasObjectInHand = false;
    106.         objInHand = null;
    107.     }
    108.  
    109.     // Função para soltar o objeto no servidor
    110.     [ServerRpc(RequireOwnership = false)]
    111.     private void DropObjectServer(GameObject obj, Transform worldHolder)
    112.     {
    113.         DropObjectObserver(obj, worldHolder);
    114.     }
    115.  
    116.     // Função para soltar o objeto nos observadores
    117.     [ObserversRpc]
    118.     private void DropObjectObserver(GameObject obj, Transform worldHolder)
    119.     {
    120.         obj.transform.parent = worldHolder;
    121.  
    122.         // Reativa a física do objeto quando é solto
    123.         if (obj.GetComponent<Rigidbody>() != null)
    124.             obj.GetComponent<Rigidbody>().isKinematic = false;
    125.     }
    126. }