Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “为什么不呢?”;transform.position=新矢量3(x,y,z)";重置我的对象';什么位置?_C#_Unity3d_Gameobject - Fatal编程技术网

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);

如果我的假设与您想要的相反,只需根据您的需要调整我的答案:验证速度是否设置为正确的(正或负)值,并检查过去的玩家比较是否正确