[英]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.