C# “为什么不呢?”;transform.position=新矢量3(x,y,z)";重置我的对象';什么位置?
我试图让一个对象沿路径移动,然后重置/移回起始位置,准备再次沿路径向下移动 该行显示为C# “为什么不呢?”;transform.position=新矢量3(x,y,z)";重置我的对象';什么位置?,c#,unity3d,gameobject,C#,Unity3d,Gameobject,我试图让一个对象沿路径移动,然后重置/移回起始位置,准备再次沿路径向下移动 该行显示为sign_obj.transform.position=startpos但是它在执行后即使在调试行中也不起作用 (如果我有头发,我会把头发拔出来!) 这是完整的代码 using System.Collections; using System.Collections.Generic; using UnityEngine; /* SignController * * controls the pla
sign_obj.transform.position=startpos代码>但是它在执行后即使在调试行中也不起作用
(如果我有头发,我会把头发拔出来!)
这是完整的代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/* SignController
*
* controls the placement of and movement of signs
*
* by: Maurice Thompson-Hamilton
* */
public class SignController : MonoBehaviour {
public GameObject sign_center;
public GameObject sign_left;
public GameObject sign_right;
public float sign_distance;
public float sign_speed;
public bool enableSigns = true;
public Vector3 startPos = new Vector3();
private List<GameObject> hazards = new List<GameObject>();
private Vector3 sign_move;
// Use this for initialization
void Start () {
// starting pos of signs
if (startPos == Vector3.zero) { startPos = new Vector3(-12.5f, 14f, 165f); }
// set move distance if not set
if (sign_distance == 0) { sign_distance = 5; }
// set move speed if not set
if (sign_speed == 0) { sign_speed = 1.25f; }
//GameObject tmp = sign_center;
sign_center.transform.Rotate(new Vector3(0, 90f, 0));
sign_left.transform.Rotate(new Vector3(0, 90f, 0));
sign_right.transform.Rotate(new Vector3(0, 90f, 0));
sign_center.transform.position = startPos;
//Debug.Log(string.Format("sign_center {0}", startPos));
startPos.z += sign_distance;
sign_left.transform.position = startPos;
//Debug.Log(string.Format("sign_left {0}", startPos));
startPos.z += sign_distance;
sign_right.transform.position = startPos;
//Debug.Log(string.Format("sign_right {0}", startPos));
// add signs to list
hazards.Add(Instantiate(sign_center, startPos, Quaternion.identity) as GameObject);
hazards.Add(Instantiate(sign_left, startPos, Quaternion.identity) as GameObject);
hazards.Add(Instantiate(sign_right, startPos, Quaternion.identity) as GameObject);
// Debug.Log(string.Format("number of signs :{0}", hazards.Count));
}
// Update is called once per frame
void Update () {
//debug - test movement
//hazards[0].transform.Translate (Vector3.forward);
if (enableSigns) {
Vector3 tmp = new Vector3(0, 0, 0);
Vector3 player_pos = GameObject.FindGameObjectWithTag("PlayerTag").transform.position;
Debug.Log(player_pos.ToString());
// sign counter
int sc = hazards.Count;
if (sc > 0) {
foreach (GameObject sign_obj in hazards) {
// get current sign's pos
tmp = sign_obj.transform.position;
// get sample of new pos
tmp.z -= sign_distance;
// test if sample pos would move sign past player's view
//if (player_pos.z > tmp.z) {
int past_player = player_pos.z.CompareTo(tmp.z);
//Debug.Log(string.Format("past_player={0}, player_pos={1}, tmp.z={2}", past_player, player_pos.z, tmp.z));
if (past_player > 0) {
// if so, set translation vector
sign_move = new Vector3(0, 0, (float)sign_distance * sign_speed * Time.deltaTime);
// move sign
sign_obj.transform.Translate(sign_move);
} else {
// otherwise, reset sign pos to starting pos
sign_obj.transform.position = startPos;
Debug.Log(string.Format("startpos@{0}, sign_obj@{1}", startPos, sign_obj.transform.position));
//tmp.z = 165f;
/*
Destroy(sign_obj);
hazards.Remove(sign_obj);
*/
}
//sign_obj.transform.position = tmp;
//Debug.Log(string.Format("player@{0} - tmp@{1} - sign@{2}",player_pos, tmp, sign_obj.transform.position));
/* if visible
* - move towards player camera
* - if behind player
* - - remove sign (Destroy?)
* else
* */
}
}
}
}
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
/*信号控制器
*
*控制标志的放置和移动
*
*作者:莫里斯·汤普森·汉密尔顿
* */
公共类签名控制器:单行为{
公共游戏对象标识中心;
公共游戏对象标志(左);;
公共游戏对象标识(右);;
公众浮标距离;
公众浮标速度;
公共布尔使能符号=真;
public Vector3 startPos=new Vector3();
私有列表危险=新列表();
私人矢量3符号移动;
//用于初始化
无效开始(){
//标志的起始位置
如果(startPos==Vector3.zero){startPos=newvector3(-12.5f,14f,165f);}
//如果未设置,则设置移动距离
如果(sign_distance==0){sign_distance=5;}
//如果未设置,则设置移动速度
如果(符号速度=0){sign速度=1.25f;}
//GameObject tmp=符号中心;
符号_中心。变换。旋转(新向量3(0,90f,0));
左符号。变换。旋转(新向量3(0,90f,0));
右签名。变换。旋转(新向量3(0,90f,0));
sign_center.transform.position=startPos;
//Log(string.Format(“sign_center{0}”,startPos));
startPos.z+=符号距离;
sign_left.transform.position=startPos;
//Log(string.Format(“sign_left{0}”,startPos));
startPos.z+=符号距离;
sign_right.transform.position=startPos;
//Log(string.Format(“sign_right{0}”,startPos));
//将符号添加到列表中
添加(实例化(签名中心、起始点、四元数、标识)为游戏对象);
添加(实例化(左签名,起始点,四元数,标识)为游戏对象);
添加(实例化(右签名,起始点,四元数,标识)为游戏对象);
//Log(string.Format(“符号数:{0}”,hazards.Count));
}
//每帧调用一次更新
无效更新(){
//调试-测试运动
//危险[0].transform.Translate(向量3.forward);
if(启用标志){
Vector3 tmp=新的Vector3(0,0,0);
Vector3 player_pos=GameObject.FindGameObjectWithTag(“PlayerTag”).transform.position;
Log(player_pos.ToString());
//标志柜台
int sc=危险。计数;
如果(sc>0){
foreach(危险中的游戏对象标志){
//获取当前标志的位置
tmp=符号对象变换位置;
//获取新pos的样本
tmp.z-=符号距离;
//测试样本位置是否会移动标志越过玩家的视线
//如果(玩家位置z>tmp.z){
int pass_player=player_pos.z.CompareTo(tmp.z);
//Log(string.Format(“pass_player={0},player_pos={1},tmp.z={2}”,pass_player,player_pos.z,tmp.z));
如果(过去的玩家>0){
//如果是,请设置平移向量
符号移动=新矢量3(0,0,(浮动)符号距离*符号速度*时间增量);
//移动标志
符号对象变换转换(符号移动);
}否则{
//否则,将标志位置重置为起始位置
sign_obj.transform.position=startPos;
Log(string.Format(“startpos@{0},sign_obj@{1}”,startpos,sign_obj.transform.position));
//tmp.z=165f;
/*
销毁(签字);
危险。移除(标志_obj);
*/
}
//符号_obj.transform.position=tmp;
//Log(string.Format(“player{0}-tmp{1}-sign{2}”、player_pos、tmp、sign_obj.transform.position));
/*如果可见
*-向玩家摄像机移动
*-如果在玩家后面
*-移除标志(销毁?)
*否则
* */
}
}
}
}
}
我已经在各种测试中留下(注释掉)以查看问题所在。根据需要复制、粘贴和取消注释。我假设您希望符号的初始Z位置大于玩家的初始Z位置,并且符号必须朝玩家移动
你要做的第一件事是纠正代码中的符号\u速度
:向玩家(较低)Z位置移动应该是负数
if(sign\u speed==0){sign\u speed=-1.25f;}
第二件事是,在计算符号是否超过玩家时,您交换了逻辑
int pass_player=tmp.z.CompareTo(player_pos.z);
如果我的假设与您想要的相反,只需根据您的需要调整我的答案:验证速度是否设置为正确的(正或负)值,并检查过去的玩家比较是否正确