想做一個簡單的傳送效果,搭建簡單場景,2個平臺,一個膠囊體(添加了角色控制器組件),一個負責充當傳送法陣的小方塊
如圖所示

傳送法陣的腳本也很簡單,就是判斷碰撞的物體名字是不是玩家
public class Teleporter : MonoBehaviour
{
CharacterController cc;
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.name == "Player")
{
//Debug.Log("collide");//測驗是否發生碰撞
cc = other.GetComponent<CharacterController>();
Debug.Log(cc.gameObject.name);//測驗cc是否獲得了玩家的角色控制器組件
cc.transform.position = new Vector3(15, 1, 0);
Debug.Log(cc.transform.position.x);//測驗cc是否改變了位置
}
}
}
結果運行后發現玩家并不會被改變位置,而控制臺打出來的資訊顯示cc確實改變了x軸位置
uj5u.com熱心網友回復:
測驗了你的代碼,沒問題呀,你檢查一下移動位置是否正確,還有就是方塊和控制器是否都是觸發器uj5u.com熱心網友回復:
位置肯定是正確的,debug也顯示發生了碰撞,cc也獲得了新的坐標值,但是玩家就是沒被移動到新的位置。方塊肯定是觸發器,角色我設了觸發器也不行
uj5u.com熱心網友回復:
經過多次測驗和查找資料,發現使用CharacterController組件后,如果在腳本中使用.Move命令去控制角色,那么這種移動方式不能被其他的CharacterController變數獲取操縱,就像我這個例子中,傳送法陣的腳本中的cc,雖然獲取到了碰撞者(玩家)的資訊,但是并不能改變它的位置。CharacterController的使用我也是照抄官方代碼,沒想到是有這種隱藏的bug
public class ExampleClass : MonoBehaviour
{
CharacterController characterController;
public float speed = 6.0f;
public float jumpSpeed = 8.0f;
public float gravity = 20.0f;
private Vector3 moveDirection = Vector3.zero;
void Start()
{
characterController = GetComponent<CharacterController>();
}
void Update()
{
if (characterController.isGrounded)
{
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical"));
moveDirection *= speed;
if (Input.GetButton("Jump"))
{
moveDirection.y = jumpSpeed;
}
}
moveDirection.y -= gravity * Time.deltaTime;
characterController.Move(moveDirection * Time.deltaTime);
}
}
后來改成用transform.Translate命令去控制角色,就可以順利被法陣傳送了
不過這樣有個問題,既然使用transform.Translate,那還要characterController干嘛呢?
uj5u.com熱心網友回復:
可你最開始代碼不是直接賦值位置嗎,這個應該不影響吧
uj5u.com熱心網友回復:
是的,在傳送法陣里面確實是直接賦值的位置,debug出來的cc.transform.position.x也確實改變了,但是玩家角色實際上并未改變
你可以自己試一下,搭建一個簡單場景(我這個也是為了測驗簡單搭建的)
----------------------改用transform.Translate是沒問題了,但是這樣又碰撞不了物體了,角色直接穿墻而過了
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/33943.html
標籤:Unity3D
下一篇:求助,虛幻4 更新失敗
