Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  3 2343
Hei folkens.


Jeg har kun brukt Unity tidligere for "fun" og aldri til noe praktisk.
Har fått i oppgave å lage en 3D modell av et landskap med noen bygninger med et objekt i midten som kamera skal roteres rundt ved å holde inne venstre museknapp og dra til høyre eller venstre.

Dette fungerer fint når jeg tester scenen min og kjører "Build and run", men når jeg velger "Build" for WebGL så fungerer ikke musa som en input. Får heller ingen feilmeldinger, så jeg vet ikke hva som kan være galt her.

Leste på forum at hvis man har lagt inn støtte for touch så vil alltid denne være "true" så man ikke fikk brukt musa, men denne koden har jeg kommentert ut, så det var ikke det som var feil.

Jeg får lagt inn så kamera automatisk roterer selv, så script blir kjørt. Men tydeligvis ikke det jeg trenger for å rotere kamera med musa.

Her er koden jeg fant på nett som fungerer i Unity, men ikke i WebGL.

Kode

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
//We want to intelligently distinguish whether we are currently at unity editor or not
public class rotateCamera : MonoBehaviour
{
    //the center of the camera rotate sphere
    public Transform target;
    public Camera sceneCamera;
 
    [Range(5f, 15f)]
    [Tooltip("How sensitive the mouse drag to camera rotation")]
    public float mouseRotateSpeed = 5f;
 
    [Range(10f, 50f)]
    [Tooltip("How sensitive the touch drag to camera rotation")]
    public float touchRotateSpeed = 10f;
 
    [Tooltip("Smaller positive value means smoother rotation, 1 means no smooth apply")]
    public float slerpSmoothValue = 0.3f;
    [Tooltip("How long the smoothDamp of the mouse scroll takes")]
    public float scrollSmoothTime = 0.12f;
    public float editorFOVSensitivity = 5f;
    public float touchFOVSensitivity = 5f;
 
    //Can we rotate camera, which means we are not blocking the view
    private bool canRotate = true;
 
    private Vector2 swipeDirection; //swipe delta vector2
    private Vector2 touch1OldPos;
    private Vector2 touch2OldPos;
    private Vector2 touch1CurrentPos;
    private Vector2 touch2CurrentPos;
    private Quaternion currentRot; // store the quaternion after the slerp operation
    private Quaternion targetRot;
    private Touch touch;
 
    //Mouse rotation related
    private float rotX; // around x
    private float rotY; // around y
    //Mouse Scroll
    private float cameraFieldOfView;
    private float cameraFOVDamp; //Damped value
    private float fovChangeVelocity = 0;
 
    private float distanceBetweenCameraAndTarget;
    //Clamp Value
    private float minXRotAngle = -85; //min angle around x axis
    private float maxXRotAngle = 85; // max angle around x axis
 
    private float minCameraFieldOfView = 6;
    private float maxCameraFieldOfView = 30;
 
    Vector3 dir;
    private void Awake()
    {
        GetCameraReference();
 
    }
    // Start is called before the first frame update
    void Start()
    {
        distanceBetweenCameraAndTarget = Vector3.Distance(sceneCamera.transform.position, target.position);
        dir = new Vector3(160, 60, distanceBetweenCameraAndTarget);//assign value to the distance between the maincamera and the target
        sceneCamera.transform.position = target.position + dir; //Initialize camera position
 
        cameraFOVDamp = sceneCamera.fieldOfView;
        cameraFieldOfView = sceneCamera.fieldOfView;
    }
 
    // Update is called once per frame
    void Update()
    {
        if (!canRotate)
        {
            return;
        }
        //We are in editor
        if (Application.isEditor || Application.platform == RuntimePlatform.WindowsPlayer)
        {
            EditorCameraInput();
        }
        else //We are in mobile mode
        {
            // TouchCameraInput();
        }
 
        if (Input.GetKeyDown(KeyCode.F))
        {
            FrontView();
        }
        if (Input.GetKeyDown(KeyCode.T))
        {
            TopView();
        }
        if (Input.GetKeyDown(KeyCode.L))
        {
            LeftView();
        }
 
    }
 
    private void LateUpdate()
    {
        RotateCamera();
        SetCameraFOV();
    }
 
    public void GetCameraReference()
    {
        if (sceneCamera == null)
        {
            sceneCamera = Camera.main;
        }
 
    }
 
    //May be the problem with Euler angles
    public void TopView()
    {
        rotX = -85;
        rotY = 0;
    }
 
    public void LeftView()
    {
        rotY = 90;
        rotX = 0;
    }
 
    public void FrontView()
    {
        rotX = 0;
        rotY = 0;
    }
 
    private void EditorCameraInput()
    {
        //Camera Rotation
        if (Input.GetMouseButton(0))
        {
            // rotX += Input.GetAxis("Mouse Y") * mouseRotateSpeed; // around X
            rotY += Input.GetAxis("Mouse X") * mouseRotateSpeed;
 
            if (rotX < minXRotAngle)
            {
                rotX = minXRotAngle;
            }
            else if (rotX > maxXRotAngle)
            {
                rotX = maxXRotAngle;
            }
        }
        //Camera Field Of View
        if (Input.mouseScrollDelta.magnitude > 0)
        {
            cameraFieldOfView += Input.mouseScrollDelta.y * editorFOVSensitivity * -1;//-1 make FOV change natual
        }
    }
 
    // private void TouchCameraInput()
    // {
    //     if (Input.touchCount > 0)
    //     {
    //         if (Input.touchCount == 1)
    //         {
    //             touch = Input.GetTouch(0);
    //             if (touch.phase == TouchPhase.Began)
    //             {
    //                 //Debug.Log("Touch Began");
 
    //             }
    //             else if (touch.phase == TouchPhase.Moved)  // the problem lies in we are still rotating object even if we move our finger toward another direction
    //             {
    //                 swipeDirection += -touch.deltaPosition * touchRotateSpeed; //-1 make rotate direction natural
    //             }
    //             else if (touch.phase == TouchPhase.Ended)
    //             {
    //                 //Debug.Log("Touch Ended");
    //             }
    //         }
    //         else if (Input.touchCount == 2)
    //         {
    //             Touch touch1 = Input.GetTouch(0);
    //             Touch touch2 = Input.GetTouch(1);
    //             if (touch1.phase == TouchPhase.Began && touch2.phase == TouchPhase.Began)
    //             {
 
    //                 touch1OldPos = touch1.position;
    //                 touch2OldPos = touch2.position;
 
    //             }
    //             if (touch1.phase == TouchPhase.Moved && touch2.phase == TouchPhase.Moved)
    //             {
    //                 touch1CurrentPos = touch1.position;
    //                 touch2CurrentPos = touch2.position;
    //                 float deltaDistance = Vector2.Distance(touch1CurrentPos, touch2CurrentPos) - Vector2.Distance(touch1OldPos, touch2OldPos);
    //                 cameraFieldOfView += deltaDistance * -1 * touchFOVSensitivity; // Make rotate direction natual
    //                 touch1OldPos = touch1CurrentPos;
    //                 touch2OldPos = touch2CurrentPos;
    //             }
 
    //         }
 
    //     }
 
    //     if (swipeDirection.y < minXRotAngle)
    //     {
    //         swipeDirection.y = minXRotAngle;
    //     }
    //     else if (swipeDirection.y > maxXRotAngle)
    //     {
    //         swipeDirection.y = maxXRotAngle;
    //     }
 
 
    // }
 
    private void RotateCamera()
    {
 
        if (Application.isEditor || Application.platform == RuntimePlatform.WindowsPlayer)
        {
            Vector3 tempV = new Vector3(rotX, rotY, 0);
            targetRot = Quaternion.Euler(tempV); //We are setting the rotation around X, Y, Z axis respectively
        }
        else
        {
            targetRot = Quaternion.Euler(-swipeDirection.y, swipeDirection.x, 0);
        }
        //Rotate Camera
        currentRot = Quaternion.Slerp(currentRot, targetRot, Time.smoothDeltaTime * slerpSmoothValue * 50);  //let cameraRot value gradually reach newQ which corresponds to our touch
        //Multiplying a quaternion by a Vector3 is essentially to apply the rotation to the Vector3
        //This case it's like rotate a stick the length of the distance between the camera and the target and then look at the target to rotate the camera.
        sceneCamera.transform.position = target.position + currentRot * dir;
        sceneCamera.transform.LookAt(target.position);
 
    }
 
 
    void SetCameraFOV()
    {
        //Set Camera Field Of View
        //Clamp Camera FOV value
        if (cameraFieldOfView <= minCameraFieldOfView)
        {
            cameraFieldOfView = minCameraFieldOfView;
        }
        else if (cameraFieldOfView >= maxCameraFieldOfView)
        {
            cameraFieldOfView = maxCameraFieldOfView;
        }
 
        cameraFOVDamp = Mathf.SmoothDamp(cameraFOVDamp, cameraFieldOfView, ref fovChangeVelocity, scrollSmoothTime);
        sceneCamera.fieldOfView = cameraFOVDamp;
 
    }
 
}

Er det noen som har tips til noe som vil fungere her? Jeg mangler kun denne funksjonen, så er prosjektet ferdig og jeg kan endelig begynne med min normale jobb igjen )
Sitat av Gameomanic Vis innlegg
Her er koden jeg fant på nett som fungerer i Unity, men ikke i WebGL.

Er det noen som har tips til noe som vil fungere her? Jeg mangler kun denne funksjonen, så er prosjektet ferdig og jeg kan endelig begynne med min normale jobb igjen )
Vis hele sitatet...
Litt av et prosjekt når man kan bare hente semi ferdig kode man ikke forstår på interwebz (:

Hvis du studerer programmering, ville jeg gått et par hakk tilbake, og revurdert hvordan du løser oppgavene du får på skolen. Det er alt for mange som bruker copy paste og sitter der uten jobb etter endt utdannelse, fordi de klarer ikke å vise til egne prosjekter når de søker jobb, men jeg skal ikke være moralvokter her.
TouchCameraInput er i alle fall kommentert ut, så det er ikke rart det ikke tar input. Bør også sjekke dokumentasjonen for input https://docs.unity3d.com/Manual/webgl-input.html i tilfelle det er andre metoder som brukes der.
Sist endret av m0b; 22. februar 2022 kl. 14:21.
@Superspurv: Her antar du litt for mye. Jeg kan ikke C# i det hele tatt, og jeg går heller ikke på skole.
Jeg driver med front-end utvikling, men dette er bare et prosjekt på jobb for å se på muligheter vi har til våre kunder.
Vi skal bare sjekke om dette fungerer, ingenting annet.

Sitat av m0b Vis innlegg
TouchCameraInput er i alle fall kommentert ut, så det er ikke rart det ikke tar input. Bør også sjekke dokumentasjonen for input https://docs.unity3d.com/Manual/webgl-input.html i tilfelle det er andre metoder som brukes der.
Vis hele sitatet...

TouchCameraInput er kommentert ut pga at jeg skulle sjekke om Touch funksjonen var problemet til at WebGL ikke ville ta imot input fra musa da jeg leste dette på Unity forumet at ikke fungerte så veldig bra.
Sist endret av Gameomanic; 22. februar 2022 kl. 14:24. Grunn: Automatisk sammenslåing med etterfølgende innlegg.