Jump to content
Unity Insider Forum

LookAtMe


Sakura Hanami

Recommended Posts

Hallo,

ich bin Anfänger und habe eine einfaches Szenario erstellt. Dazu habe ich einen FPSController und ein Model (von Mixamo). Das Model tanzt. Wenn ich darauf zugehe soll es stehen bleiben, nach Idle State wechseln und zu FPSController schauen. Dazu habe ich mir eine distance von 7 Units gewählt. Es funktioniert auch. Allerdings neigt sich das Model nach hinten. Wenn ich mich weiter zurückbewege richtet sie sich wieder auf. Target ist der FPSController.

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

public class ArrisaSpeechWithMe : MonoBehaviour
{

    public float distance;       // Öffentlich zum beobachten
    public float speechRange;
    private Animator anim;
    public Transform target;

    // Use this for initialization
    void Start()
    {
        anim = GetComponent<Animator>();
        speechRange = 7;
    }

    // Update is called once per frame
    void Update()
    {
        distance = Vector3.Distance(target.position, transform.position);

        if (distance < speechRange)
        {
            anim.SetBool("isIdle", true);
            
            LookAt();
        }
    }

    void LookAt()
    {
        // Hier muss ein Fehler auftreten
        Quaternion rotation = Quaternion.LookRotation(target.position - transform.position);
        transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime);
    }
}

Hat jemand eine Idee und kann mir einen Tip geben

 

ArrisaSpeechWithMe.cs

Insel.exe

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ganze Model mit LookRotation zu drehen ist keine gute Idee, zudem dein Charakter animiert ist.

Ein Weg wäre ein IK (Inverse Kinematic) auf den Charakter zu legen und dann entweder nur den Kopf (oder Kopf + Body) auf ein Ziel auszurichten. Dieses Ziel kann die Kamera des FPS-Controllers sein.

Hier ein Beispiel wie das dann aussieht, ca. ab Mitte des Videos. Der Charakter schaut in Richrung Kamera, wenn sich die Kamera vor den Charakter befindet.
https://streamable.com/68h6h

Ansonsten eine einfache Lösung wäre, wenn du den Charakter nur in Y drehst. LookRotation dreht über alle Achsen und dies ist eher ungünstig.

Hier eine schnelle Lösung, musst du mal Testen, ob dir das reicht:

    void LookAt()
    {
        Vector3 viewPoint = new Vector3(target.position.x,transform.position.y,target.position.z)  - transform.position;

        Quaternion rotation = Quaternion.LookRotation(viewPoint);
        transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime);
    }

Natürlich kann man auch beides Mischen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...