簡體   English   中英

在 Unity3D 中控制游戲對象時傳送

[英]Teleport while Controlling GameObject in Unity3D

我是一名大一設計專業的學生,他們要求我們在沒有太多培訓的情況下在 unity3D 上創建一個游戲,所以不用說,除了超級基本的東西,我知道的不多。 我對 c# 一無所知,而且我在制作游戲對象傳送時遇到了問題。 我花了 6 個小時在網上尋找解決方案,我得到的唯一結論是我的 object 可能由於我控制它的方式而在傳送方面存在問題 - 這與 controller 記住最后一個 Z4757FE07FD492A8DBEDDEA6 之前的 Z4757FE07FD492A8DBEDDEA6 和 7回到它。 我不知道如何解決它。 所以這就是我的場景的樣子:我有一個球體作為我的角色,我將它移動到另一個 object,它有一個對撞機作為觸發器,然后將我的球體傳送到地形上的不同點(黑色物體)。 一旦我的 object 到達那里,它就會開始滑回傳送發生的位置。 我什至嘗試了許多建議的編輯>項目設置>物理>自動同步轉換,它對他們有用。

這是我控制播放器的代碼:

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

public class MyPlayer : MonoBehaviour
{
    public float speed = 1;
    public float spacing = 1;
    private Vector3 pos;


    // Use this for initialization
    void Awake()
    {
        pos = transform.position;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
            pos.x += spacing;
        if (Input.GetKeyDown(KeyCode.S))
            pos.x -= spacing;
        if (Input.GetKeyDown(KeyCode.D))
            pos.z -= spacing;
        if (Input.GetKeyDown(KeyCode.A))
            pos.z += spacing;


        transform.position = Vector3.MoveTowards(transform.position, pos, speed * Time.deltaTime);

    }
}

而且我還有一個使用此代碼跟隨球體的相機

using UnityEngine;
using System.Collections;

public class CompleteCameraController : MonoBehaviour {

    public GameObject player;       //Public variable to store a reference to the player game object


    private Vector3 offset;         //Private variable to store the offset distance between the player and camera

    // Use this for initialization
    void Start () 
    {
        //Calculate and store the offset value by getting the distance between the player's position and camera's position.
        offset = transform.position - player.transform.position;
    }
    
    // LateUpdate is called after Update each frame
    void LateUpdate () 
    {
        // Set the position of the camera's transform to be the same as the player's, but offset by the calculated offset distance.
        transform.position = player.transform.position + offset;
    }
}

我在相機上有另一個代碼,讓我可以用鼠標環顧四周

 using UnityEngine;
 using System.Collections;
 public class FlyCamera : MonoBehaviour
 {
     /*
     Writen by Windexglow 11-13-10.  Use it, edit it, steal it I don't care.  
     Converted to C# 27-02-13 - no credit wanted.
     Simple flycam I made, since I couldn't find any others made public.  
     Made simple to use (drag and drop, done) for regular keyboard layout  
     wasd : basic movement
     shift : Makes camera accelerate
     space : Moves camera on X and Z axis only.  So camera doesn't gain any height*/
     float mainSpeed = 700.0f; //regular speed
     float shiftAdd = 950.0f; //multiplied by how long shift is held.  Basically running
     float maxShift = 2000.0f; //Maximum speed when holdin gshift
     float camSens = 0.25f; //How sensitive it with mouse
     private Vector3 lastMouse = new Vector3(255, 255, 255); //kind of in the middle of the screen, rather than at the top (play)
     private float totalRun = 1.0f;
     void Update()
     {
         lastMouse = Input.mousePosition - lastMouse;
         lastMouse = new Vector3(-lastMouse.y * camSens, lastMouse.x * camSens, 0);
         lastMouse = new Vector3(transform.eulerAngles.x + lastMouse.x, transform.eulerAngles.y + lastMouse.y, 0);
         transform.eulerAngles = lastMouse;
         lastMouse = Input.mousePosition;
         //Mouse  camera angle done.  
         //Keyboard commands
         float f = 0.0f;
         Vector3 p = GetBaseInput();
         if (Input.GetKey(KeyCode.LeftShift))
         {
             totalRun += Time.deltaTime;
             p = p * totalRun * shiftAdd;
             p.x = Mathf.Clamp(p.x, -maxShift, maxShift);
             p.y = Mathf.Clamp(p.y, -maxShift, maxShift);
             p.z = Mathf.Clamp(p.z, -maxShift, maxShift);
         }
         else
         {
             totalRun = Mathf.Clamp(totalRun * 0.5f, 1f, 1000f);
             p = p * mainSpeed;
         }
         p = p * Time.deltaTime;
         Vector3 newPosition = transform.position;
         if (Input.GetKey(KeyCode.Space))
         { //If player wants to move on X and Z axis only
             transform.Translate(p);
             newPosition.x = transform.position.x;
             newPosition.z = transform.position.z;
             transform.position = newPosition;
         }
         else
         {
             transform.Translate(p);
         }
     }
     private Vector3 GetBaseInput()
     { //returns the basic values, if it's 0 than it's not active.
         Vector3 p_Velocity = new Vector3();
         if (Input.GetKey(KeyCode.W))
         {
             p_Velocity += new Vector3(0, 0, 1);
         }
         if (Input.GetKey(KeyCode.S))
         {
             p_Velocity += new Vector3(0, 0, -1);
         }
         if (Input.GetKey(KeyCode.A))
         {
             p_Velocity += new Vector3(-1, 0, 0);
         }
         if (Input.GetKey(KeyCode.D))
         {
             p_Velocity += new Vector3(1, 0, 0);
         }
         return p_Velocity;
     }
 }

如果我需要編輯代碼的特定部分來解決這個問題,或者如果你有一個不會給我這個問題的不同代碼,請告訴我,這會讓我的生活變得更輕松。 如果我需要編輯某些內容或者您正在共享代碼,請回復完整(更正)的代碼,否則我會更加困惑。

我知道這是一個超長的帖子,我很抱歉,但我真的很絕望。 在網上學習真的很辛苦,而且基本上必須自學所有這些。 這是一個最終項目,因此我將非常感謝您提供的任何幫助。 感謝您閱讀並提前感謝您的任何幫助。

編輯:傳送代碼執行得很好,因為我確實傳送到了選定的位置,我最終只是滑回了我傳送的點。

這是我正在使用的傳送代碼。

using UnityEngine;
using System.Collections;

public class Teleport : MonoBehaviour
{
    public GameObject ui;
    public GameObject objToTP;
    public Transform tpLoc;
    void Start()
    {
        ui.SetActive(false);
    }

    void OnTriggerStay(Collider other)
    {
        ui.SetActive(true);
        if ((other.gameObject.tag == "Player") && Input.GetKeyDown(KeyCode.E))
        {
            objToTP.transform.position = tpLoc.transform.position;
        }
    }
    void OnTriggerExit()
    {
        ui.SetActive(false);
    }
}

好的,所以你的角色回到原來的 position 的主要原因是MyPlayer腳本中的pos變量在傳送后保持不變。

解決方法是在objToTP.transform.position = tpLoc.transform.position;之后從Teleport腳本更改pos變量; . 類似objToTP.gameobject.GetComponent<MyPlayer>().pos = tpLoc.transform.position

但請確保objToTP具有組件MyPlayer並且MyPlayer中的pos是公共的。

再一次:這是解決問題的簡單方法。 在實際項目中,您應該創建更靈活的架構,但那是另一回事。

我相信您會向后滑動,因為您在 Update() 中使用transform.position = Vector3.MoveTowards移動播放器。
然后將其移動到從輸入中獲得的坐標

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM