【问题标题】:Raycasting Unity3d 3rd person shooter shooting out wrongRaycasting Unity3d 第三人称射击游戏射击错误
【发布时间】:2015-01-21 04:49:39
【问题描述】:

我试图让靠近我的玩家的敌人跟随他。 如果他直接在他们面前,我会让他们跟随我的球员,但这不是我想要的。我希望他们投射他的位置或以某种方式让他们在离他如此之近时跟随他。

这是我需要帮助的一点。它附加到被实例化的敌人预制件上。

 var playerray : RaycastHit;
 var fwd = transform.TransformDirection (Vector3(Player.transform.position.x,Player.transform.position.y,Player.transform.position.z));
 if (Physics.Raycast(myTransform.position,fwd, playerray, DetectionDist)){
     Debug.DrawRay (transform.position, fwd, Color.red);
 }

由于某种原因,基本上方向偏离了,我不知道为什么。

这是完整的脚本以防万一。

#pragma strict

var Speed : float = 8000;
var RayDist : float = 100;
var speed : float = 100;
var Player : Transform;
var attackPoint : Transform;
var Bullet : GameObject;
var myTransform : Transform;
var attackbase: boolean;
var spotted :boolean;
var DetectionDist : int = 100;

function Start(){
    myTransform = transform;
    Player = GameObject.Find("Player").transform;
    attackPoint = GameObject.Find("attackPoint").transform;
}

function Update () {
    var hit: RaycastHit;
    if (Physics.Raycast(transform.position,transform.forward, hit, RayDist)){
        Debug.DrawRay(transform.position,Vector3.forward, Color.green);

        if(hit.collider.tag == "Player")
        {
            spotted = true;
        }
    }
    if(spotted == true){
        var F = Quaternion.LookRotation(Vector3(Player.position.x, myTransform.position.y, Player.position.z) - myTransform.position);
        transform.rotation = Quaternion.RotateTowards(transform.rotation, F, speed * Time.deltaTime);
        myTransform.position += myTransform.forward * Speed * Time.deltaTime;
    }
    if(spotted == false){
        var A = Quaternion.LookRotation(Vector3(attackPoint.position.x, myTransform.position.y, attackPoint.position.z) - myTransform.position);
        transform.rotation = Quaternion.RotateTowards(transform.rotation, A, speed * Time.deltaTime);
        myTransform.position += myTransform.forward * Speed * Time.deltaTime;
    }
//////////////////////ENEMY TO PLAYER RAY////////////////////////////////////////
    var playerray : RaycastHit;
    var fwd = transform.TransformDirection (Vector3(Player.transform.position.x,Player.transform.position.y,Player.transform.position.z));
    if (Physics.Raycast(myTransform.position,fwd, playerray, DetectionDist)){
        Debug.DrawRay (transform.position, fwd, Color.red);
    }
}
function OnCollisionEnter(coll : Collision){
    if(coll.gameObject.tag == "Pbullet"){
        Destroy(gameObject);
    }
    if(coll.gameObject.tag == "Player"){
        ///attack and make Player flash red.
    }
}

【问题讨论】:

  • 你为什么希望别人看到你的屏幕截图会遇到这么多麻烦?只需在此处上传即可。
  • 对不起 m8 我不是 lv 10 这个网站有一些优点和缺点。
  • 非常感谢您的帮助。

标签: unity3d unityscript


【解决方案1】:
var fwd = (Player.transform.position - transform.position).normalized;

此代码修复了我的错误。它现在是完美的光线。

【讨论】:

  • 你绝对不应该为此对每一帧都进行光线投射。如果距离很重要,并且您已经可以访问玩家的位置,为什么不测试 (Player.transform.position - transform.position).magnitude 是否小于检测范围?如果此检测被障碍物阻挡很重要,您可以在之后进行光线投射,但投射每一帧都会变得非常慢。
  • 你好朋友,你能举个例子吗?或者重写我的代码,以便检查两个对象之间的变换位置
猜你喜欢
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
相关资源
最近更新 更多