En este momento estás viendo mi cuerda se estira infinitamente cuando coloco un objeto sobre ella

 – Unity

mi cuerda se estira infinitamente cuando coloco un objeto sobre ella – Unity

mi cuerda se estira infinitamente cuando coloco un objeto sobre ella

– UnityAssets3Free

bienvenido , me llamo Juan y en esta ocasion os traigo
nueva pregunta curiosa

Tengo una cuerda generada por código puro en un script para hacer una línea de pesca en unity. El problema aquí es cuando coloco el flotador de pesca en el extremo de la cuerda, la cuerda se estira infinitamente y quiero que el flotador cuelgue, traté de cambiar el la longitud de la cuerda y los tamaños de los segmentos, pero sigue estirándose, también sé que hay otra forma con la junta de bisagra 2d de Unity, pero no creo que sea lo suficientemente realista como para hacer una línea de pesca

Aquí está mi código:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class hiloCanya : MonoBehaviour

    private LineRenderer lineRenderer;
    private List<HiloSegmento> hiloSegmentos = new List<HiloSegmento>();
    private float hiloSegLen = 0.25f;
    private int segmentoLength = 35;
    private float lineWidth = 0.05f;

    [SerializeField] private Transform startPoint;
    [SerializeField] private Transform endPoint;

    // Use this for initialization
    void Start()
    
        this.lineRenderer = this.GetComponent<LineRenderer>();
        Vector3 hiloStartPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);

        for (int i = 0; i < segmentoLength; i++)
        
            this.hiloSegmentos.Add(new HiloSegmento(hiloStartPoint));
            hiloStartPoint.y -= hiloSegLen;
        
    

    // Update is called once per frame
    void Update()
    
        this.DrawRope();
    

    private void FixedUpdate()
    
        this.Simulate();
    

    private void Simulate()
    
        // SIMULACION
        Vector2 fuerzaGravedad = new Vector2(0f, -1.5f);

        for (int i = 1; i < this.segmentoLength; i++)
        
            HiloSegmento primerSegmento = this.hiloSegmentos[i];
            Vector2 velocidad = primerSegmento.posNow - primerSegmento.posOld;

            primerSegmento.posOld = primerSegmento.posNow;
            primerSegmento.posNow += velocidad;
            primerSegmento.posNow += fuerzaGravedad * Time.fixedDeltaTime;

            this.hiloSegmentos[i] = primerSegmento;
        

        //CONSTRAINTS
        for (int i = 0; i < 50; i++)
        
            this.ApplyConstraint();
        
    

    private void ApplyConstraint()
    
        //Constrant to Mouse

        /* HiloSegmento primerSegmento = this.hiloSegmentos[0];
        primerSegmento.posNow = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        this.hiloSegmentos[0] = primerSegmento; */

        //objeto para el principio del hilo

        HiloSegmento primerSegmento = this.hiloSegmentos[0];
        primerSegmento.posNow = this.startPoint.position;
        this.hiloSegmentos[0] = primerSegmento;

        //objeto para el final del hilo
        HiloSegmento finalSegmento = this.hiloSegmentos[this.segmentoLength - 1];
        finalSegmento.posNow = this.endPoint.position;
        this.hiloSegmentos[this.segmentoLength - 1] = finalSegmento;

        for (int i = 0; i < this.segmentoLength - 1; i++)
        
            HiloSegmento primerSeg = this.hiloSegmentos[i];
            HiloSegmento segundoSeg = this.hiloSegmentos[i + 1];
            float dist = (primerSeg.posNow - segundoSeg.posNow).magnitude;
            float error = Mathf.Abs(dist - this.hiloSegLen);
            Vector2 changeDir = Vector2.zero;

            if (dist > hiloSegLen)
            
                changeDir = (primerSeg.posNow - segundoSeg.posNow).normalized;
            
            else if (dist < hiloSegLen)
            
                changeDir = (segundoSeg.posNow - primerSeg.posNow).normalized;
            

            Vector2 changeAmount = changeDir * error;

            if (i != 0)
            
                primerSeg.posNow -= changeAmount * 0.5f;
                this.hiloSegmentos[i] = primerSeg;

                segundoSeg.posNow += changeAmount * 0.5f;
                this.hiloSegmentos[i + 1] = segundoSeg;
            
            else
            
                segundoSeg.posNow += changeAmount;
                this.hiloSegmentos[i + 1] = segundoSeg;
            
        
    

    private void DrawRope()
    
        float lineWidth = this.lineWidth;
        lineRenderer.startWidth = lineWidth;
        lineRenderer.endWidth = lineWidth;

        Vector3[] posicionesHilo = new Vector3[this.segmentoLength];

        for (int i = 0; i < this.segmentoLength; i++)
        
            posicionesHilo[i] = this.hiloSegmentos[i].posNow;
        

        lineRenderer.positionCount = posicionesHilo.Length;
        lineRenderer.SetPositions(posicionesHilo);
    

    public struct HiloSegmento
    
        public Vector2 posNow;
        public Vector2 posOld;

        public HiloSegmento(Vector2 pos)
        
            this.posNow = pos;
            this.posOld = pos;
        
    

1 respuesta 1

¿Ha probado también Spring Joint en Unity? Podría ser lo suficientemente realista y puede evitar tener que codificar mucho.

nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias

por hoy,hasta la proxima

Deja una respuesta