Çözüldü Unity obje (Reach) istenilen gibi hareket etmiyor

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

saphary

Hectopat
Katılım
2 Eylül 2019
Mesajlar
4.359
Makaleler
5
Çözümler
12
Yer
Antalya
Daha fazla  
Sistem Özellikleri
R5 2600, RX590, 16GB, Corsair Delta Spec
Cinsiyet
Erkek
Meslek
Boş İşler Erbabı
Oyuncunun diğer objeler ile etkileşime geçmesi için bir küp oluşturdum ve adını "Reach" yapıp yine Reach adında bir tag atadım. Bu eleman Collider ve Tag yetenekleri sayesinde oyunu daha iyi bir hale getiriyor ama bir problem var. Kendisinin Mesh Renderer'i ile Collider'i aynı ölçüde gitmiyor. Ayrıca yatay duruşuyla dik duruşu arasında uzunluk farkı var. Crosshair ile doğru orantılı hareket etmiyor ne yapacağımı bilmiyorum. Beş tane görsel ekleyeceğim belki yardımcı olur. Yanlış kutucukları işaretlemiş olabilir miyim? Belki yeni bir Reach yapmama yardımcı olacak birileri vardır.

Buddy - SampleScene - PC, Mac & Linux Standalone - Unity 2020.3.34f1 Personal_ _DX11_ 11.08.20...png

Buddy - SampleScene - PC, Mac & Linux Standalone - Unity 2020.3.34f1 Personal_ _DX11_ 11.08.20...png

Buddy - SampleScene - PC, Mac & Linux Standalone - Unity 2020.3.34f1 Personal_ _DX11_ 11.08.20...png

Buddy - SampleScene - PC, Mac & Linux Standalone - Unity 2020.3.34f1 Personal_ _DX11_ 11.08.20...png

Buddy - SampleScene - PC, Mac & Linux Standalone - Unity 2020.3.34f1 Personal_ _DX11_ 11.08.20...png
 
Çözüm
Sorunu çözdünüz mü?
Yok hocam daha bilgisayara geçemedim. O mesajı yazdıktan 10 dakika falan sonra saldım. Akşama doğru belki yapabilirim.

Evet sorunun kaynağını buldum. Ben FPSController'i büyütmek için Transform değerlerini kullanmıştım ve o yüzden böyle olmuş. Önce değiştirdiğim Transform değerlerini resetledim ve sonra bizzat "Character Controller" bileşeni üzerinden karakteri büyüttüm. Şu an büyüme küçülme oraya buraya kaçma durumu yok. Böyle saçma sorunların insanın onlarca saatini alabilmesi hayret edici.

@user.cs yardımın için teşekkürler dostum.
Oyuncunun diğer objeler ile etkileşime geçmesi için bir küp oluşturdum ve adını "Reach" yapıp yine Reach adında bir tag atadım. Bu eleman Collider ve Tag yetenekleri sayesinde oyunu daha iyi bir hale getiriyor ama bir problem var. Kendisinin Mesh Renderer'i ile Collider'i aynı ölçüde gitmiyor. Ayrıca yatay duruşuyla dik duruşu arasında uzunluk farkı var. Crosshair ile doğru orantılı hareket etmiyor ne yapacağımı bilmiyorum. Beş tane görsel ekleyeceğim belki yardımcı olur. Yanlış kutucukları işaretlemiş olabilir miyim? Belki yeni bir Reach yapmama yardımcı olacak birileri vardır.





Mesh Collider kullandınız değil mi?
 
Mesh Collider kullandınız değil mi?
Box Collider kullanıyordum hocam. Mesh Collider yapınca çok daha iyi oldu ama yukarıya doğru giderken bir anda arşa çıkıyor halen. Rigidbody'in dengelemesi gerekiyor diye biliyorum ama işe yaramıyor. Bunun için bir çözümünüz var mı?
 
Box Collider kullanıyordum hocam. Mesh Collider yapınca çok daha iyi oldu ama yukarıya doğru giderken bir anda arşa çıkıyor halen. Rigidbody'in dengelemesi gerekiyor diye biliyorum ama işe yaramıyor. Bunun için bir çözümünüz var mı?
Gravity-scaleı veya massi arttırınca düzelmesi lazım.

Ancak gravity-scaleı değiştirirseniz oyun içinde sorun olabilir.
 
Gravity-scaleı veya massi arttırınca düzelmesi lazım.

Ancak gravity-scaleı değiştirirseniz oyun içinde sorun olabilir.
Yok hocam olmuyor. Aklıma gelen tüm noktaları deniyorum olmuyor. Reach sadece orta kısımda, en yukarıda ve en aşağıda crosshair ile uyuşuyor. Bu üç kısmın aralarında Reach çok hızlı hareket edip kod ile sınırladığım yere kadar gidiyor. Sağa sola dönüşler gayet iyi sadece yukarı aşağı problem yaratıyor.
 
Yok hocam olmuyor. Aklıma gelen tüm noktaları deniyorum olmuyor. Reach sadece orta kısımda, en yukarıda ve en aşağıda crosshair ile uyuşuyor. Bu üç kısmın aralarında Reach çok hızlı hareket edip kod ile sınırladığım yere kadar gidiyor. Sağa sola dönüşler gayet iyi sadece yukarı aşağı problem yaratıyor.
Sorun biraz karmaşık. Dedikleriniz arasında bir hata bulamadım. Sadece o nesneye mi özel yoksa her nesnede mi oluyor?
 
Sorun biraz karmaşık. Dedikleriniz arasında bir hata bulamadım. Sadece o nesneye mi özel yoksa her nesnede mi oluyor?
Diğer objelerde böyle bir problem yok. Yeni bir Reach daha yapmayı deneyeceğim.

Unity Standard Asset paketinin içindeki FPSController'i kullanıyorum. Herhangi bir objeyi FPSController'in çocuğu yaptığım zaman Collider ile ters hareket ediyor. Objeyi çıkarınca ise Mesh ile Collider doğru orantıda hareket ediyor.

Mesh Collider atayıp kurtulayım desem bu sefer obje döneceği şekilde dönmüyor küp yamuğa dönüşüyor. Yeni bir Controller yaratırsam sorunu çözerim ama tahta kurusu için yorgan yakmak istemiyorum. Problemi bir Component yaratıyor olabilir mi? İlginizi çekebilecek şeyleri aşağıya atıyorum.

C#:
using System;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;
using UnityStandardAssets.Utility;
using Random = UnityEngine.Random;

#pragma warning disable 618, 649
namespace UnityStandardAssets.Characters.FirstPerson
{
    [RequireComponent(typeof (CharacterController))]
    [RequireComponent(typeof (AudioSource))]
    public class FirstPersonController : MonoBehaviour
    {
        [SerializeField] private bool m_IsWalking;
        [SerializeField] private float m_WalkSpeed;
        [SerializeField] private float m_RunSpeed;
        [SerializeField] [Range(0f, 1f)] private float m_RunstepLenghten;
        [SerializeField] private float m_JumpSpeed;
        [SerializeField] private float m_StickToGroundForce;
        [SerializeField] private float m_GravityMultiplier;
        [SerializeField] private MouseLook m_MouseLook;
        [SerializeField] private bool m_UseFovKick;
        [SerializeField] private FOVKick m_FovKick = new FOVKick();
        [SerializeField] private bool m_UseHeadBob;
        [SerializeField] private CurveControlledBob m_HeadBob = new CurveControlledBob();
        [SerializeField] private LerpControlledBob m_JumpBob = new LerpControlledBob();
        [SerializeField] private float m_StepInterval;
        [SerializeField] private AudioClip[] m_FootstepSounds;    // an array of footstep sounds that will be randomly selected from.
        [SerializeField] private AudioClip m_JumpSound;           // the sound played when character leaves the ground.
        [SerializeField] private AudioClip m_LandSound;           // the sound played when character touches back on ground.

        private Camera m_Camera;
        private bool m_Jump;
        private float m_YRotation;
        private Vector2 m_Input;
        private Vector3 m_MoveDir = Vector3.zero;
        private CharacterController m_CharacterController;
        private CollisionFlags m_CollisionFlags;
        private bool m_PreviouslyGrounded;
        private Vector3 m_OriginalCameraPosition;
        private float m_StepCycle;
        private float m_NextStep;
        private bool m_Jumping;
        private AudioSource m_AudioSource;

        // Use this for initialization
        private void Start()
        {
            m_CharacterController = GetComponent<CharacterController>();
            m_Camera = Camera.main;
            m_OriginalCameraPosition = m_Camera.transform.localPosition;
            m_FovKick.Setup(m_Camera);
            m_HeadBob.Setup(m_Camera, m_StepInterval);
            m_StepCycle = 0f;
            m_NextStep = m_StepCycle/2f;
            m_Jumping = false;
            m_AudioSource = GetComponent<AudioSource>();
            m_MouseLook.Init(transform , m_Camera.transform);
        }


        // Update is called once per frame
        private void Update()
        {
            RotateView();
            // the jump state needs to read here to make sure it is not missed
            if (!m_Jump)
            {
                m_Jump = CrossPlatformInputManager.GetButtonDown("Jump");
            }

            if (!m_PreviouslyGrounded && m_CharacterController.isGrounded)
            {
                StartCoroutine(m_JumpBob.DoBobCycle());
                PlayLandingSound();
                m_MoveDir.y = 0f;
                m_Jumping = false;
            }
            if (!m_CharacterController.isGrounded && !m_Jumping && m_PreviouslyGrounded)
            {
                m_MoveDir.y = 0f;
            }

            m_PreviouslyGrounded = m_CharacterController.isGrounded;
        }


        private void PlayLandingSound()
        {
            m_AudioSource.clip = m_LandSound;
            m_AudioSource.Play();
            m_NextStep = m_StepCycle + .5f;
        }


        private void FixedUpdate()
        {
            float speed;
            GetInput(out speed);
            // always move along the camera forward as it is the direction that it being aimed at
            Vector3 desiredMove = transform.forward*m_Input.y + transform.right*m_Input.x;

            // get a normal for the surface that is being touched to move along it
            RaycastHit hitInfo;
            Physics.SphereCast(transform.position, m_CharacterController.radius, Vector3.down, out hitInfo,
                               m_CharacterController.height/2f, Physics.AllLayers, QueryTriggerInteraction.Ignore);
            desiredMove = Vector3.ProjectOnPlane(desiredMove, hitInfo.normal).normalized;

            m_MoveDir.x = desiredMove.x*speed;
            m_MoveDir.z = desiredMove.z*speed;


            if (m_CharacterController.isGrounded)
            {
                m_MoveDir.y = -m_StickToGroundForce;

                if (m_Jump)
                {
                    m_MoveDir.y = m_JumpSpeed;
                    PlayJumpSound();
                    m_Jump = false;
                    m_Jumping = true;
                }
            }
            else
            {
                m_MoveDir += Physics.gravity*m_GravityMultiplier*Time.fixedDeltaTime;
            }
            m_CollisionFlags = m_CharacterController.Move(m_MoveDir*Time.fixedDeltaTime);

            ProgressStepCycle(speed);
            UpdateCameraPosition(speed);

            m_MouseLook.UpdateCursorLock();
        }


        private void PlayJumpSound()
        {
            m_AudioSource.clip = m_JumpSound;
            m_AudioSource.Play();
        }


        private void ProgressStepCycle(float speed)
        {
            if (m_CharacterController.velocity.sqrMagnitude > 0 && (m_Input.x != 0 || m_Input.y != 0))
            {
                m_StepCycle += (m_CharacterController.velocity.magnitude + (speed*(m_IsWalking ? 1f : m_RunstepLenghten)))*
                             Time.fixedDeltaTime;
            }

            if (!(m_StepCycle > m_NextStep))
            {
                return;
            }

            m_NextStep = m_StepCycle + m_StepInterval;

            PlayFootStepAudio();
        }


        private void PlayFootStepAudio()
        {
            if (!m_CharacterController.isGrounded)
            {
                return;
            }
            // pick & play a random footstep sound from the array,
            // excluding sound at index 0
            int n = Random.Range(1, m_FootstepSounds.Length);
            m_AudioSource.clip = m_FootstepSounds[n];
            m_AudioSource.PlayOneShot(m_AudioSource.clip);
            // move picked sound to index 0 so it's not picked next time
            m_FootstepSounds[n] = m_FootstepSounds[0];
            m_FootstepSounds[0] = m_AudioSource.clip;
        }


        private void UpdateCameraPosition(float speed)
        {
            Vector3 newCameraPosition;
            if (!m_UseHeadBob)
            {
                return;
            }
            if (m_CharacterController.velocity.magnitude > 0 && m_CharacterController.isGrounded)
            {
                m_Camera.transform.localPosition =
                    m_HeadBob.DoHeadBob(m_CharacterController.velocity.magnitude +
                                      (speed*(m_IsWalking ? 1f : m_RunstepLenghten)));
                newCameraPosition = m_Camera.transform.localPosition;
                newCameraPosition.y = m_Camera.transform.localPosition.y - m_JumpBob.Offset();
            }
            else
            {
                newCameraPosition = m_Camera.transform.localPosition;
                newCameraPosition.y = m_OriginalCameraPosition.y - m_JumpBob.Offset();
            }
            m_Camera.transform.localPosition = newCameraPosition;
        }


        private void GetInput(out float speed)
        {
            // Read input
            float horizontal = CrossPlatformInputManager.GetAxis("Horizontal");
            float vertical = CrossPlatformInputManager.GetAxis("Vertical");

            bool waswalking = m_IsWalking;

#if !MOBILE_INPUT
            // On standalone builds, walk/run speed is modified by a key press.
            // keep track of whether or not the character is walking or running
            m_IsWalking = !Input.GetKey(KeyCode.LeftShift);
#endif
            // set the desired speed to be walking or running
            speed = m_IsWalking ? m_WalkSpeed : m_RunSpeed;
            m_Input = new Vector2(horizontal, vertical);

            // normalize input if it exceeds 1 in combined length:
            if (m_Input.sqrMagnitude > 1)
            {
                m_Input.Normalize();
            }

            // handle speed change to give an fov kick
            // only if the player is going to a run, is running and the fovkick is to be used
            if (m_IsWalking != waswalking && m_UseFovKick && m_CharacterController.velocity.sqrMagnitude > 0)
            {
                StopAllCoroutines();
                StartCoroutine(!m_IsWalking ? m_FovKick.FOVKickUp() : m_FovKick.FOVKickDown());
            }
        }


        private void RotateView()
        {
            m_MouseLook.LookRotation (transform, m_Camera.transform);
        }


        private void OnControllerColliderHit(ControllerColliderHit hit)
        {
            Rigidbody body = hit.collider.attachedRigidbody;
            //dont move the rigidbody if the character is on top of it
            if (m_CollisionFlags == CollisionFlags.Below)
            {
                return;
            }

            if (body == null || body.isKinematic)
            {
                return;
            }
            body.AddForceAtPosition(m_CharacterController.velocity * 0.1f, hit.point, ForceMode.Impulse);
        }


    }
}

Buddy - SampleScene - PC, Mac & Linux Standalone - Unity 2020.3.34f1 Personal_ _DX11_ 12.08.20...png

Bazı şeyler denediğim zaman bambaşka sorunlar çıkıyor karşıma. Hiç kurcalamamak lazım. Bununla ilgili yeni bir konu açacağım.
 
Son düzenleme:
Mesh Collider atayıp kurtulayım desem bu sefer obje döneceği şekilde dönmüyor küp yamuğa dönüşüyor. Yeni bir Controller yaratırsam sorunu çözerim ama tahta kurusu için yorgan yakmak istemiyorum. Problemi bir Component yaratıyor olabilir mi? İlginizi çekebilecek şeyleri aşağıya atıyorum.
Sorun component kaynaklı değil gibi.

Unity Standard Asset paketinin içindeki FPSController'i kullanıyorum. Herhangi bir objeyi FPSController'in çocuğu yaptığım zaman Collider ile ters hareket ediyor. Objeyi çıkarınca ise Mesh ile Collider doğru orantıda hareket ediyor.
Standart FPS karakterini önermiyorum. Gerçekten karmaşık scriptleri var ve kendi isteğinize göre ayarlaması çok zor. Kendi FPS Controllerınızı yazarsanız daha rahat kodlayabilirsiniz oyunu.
 
Standart FPS karakterini önermiyorum. Gerçekten karmaşık scriptleri var ve kendi isteğinize göre ayarlaması çok zor. Kendi FPS Controllerınızı yazarsanız daha rahat kodlayabilirsiniz oyunu.
Kendi controllerimi yazmak zorunda kalacağım anlaşılan. Şöyle bir konu daha açtım ama çözüm bulamadık.
 
Kendi controllerimi yazmak zorunda kalacağım anlaşılan. Şöyle bir konu daha açtım ama çözüm bulamadık.
Dediğim gibi Unity'nin default FPS Controllerı çok karmaşık ki siz sadece hareket ve zıplama özelliklerini kullanmak istiyorsunuz gibi görünüyor. İhtiyaç not defteri alınan bilgisayar gibi olmuş bu. Zaten bu dedikleriniz character controller ile gayet kolay. Emin olun kendi yazdığınız controller ile daha az sorun yaşarsınız.
Obje taşıma sisteminin yapacağı işlem basit. Raycast ile vurulan obje taşıma şartlarına uygunsa parent olarak karakter atanır. Sorun karakter kaynaklı görünüyor.
 

Geri
Yukarı