上帝视角算法

using UnityEngine;

using System.Collections;

 

public class Followplayer : MonoBehaviour

{

    privateVector3 offset;

    privateTransform player;

    //Use this for initialization

    privatevoid Awake()

    {

        player = GameObject.FindGameObjectWithTag("Player").transform;

        offset =transform.position - player.position;//计算偏移

        offset = new Vector3(0,offset.y, offset.z);

    }

 

    voidStart()

    {

 

    }

 

    //Update is called once per frame

    voidUpdate()

    {

        Vector3beginpos = offset + player.position;

        Vector3endpos = player.position + offset.magnitude * Vector3.up;//offset.magnitude为计算长度得到垂直长度

        Vector3pos1 = Vector3.Lerp(beginpos, endpos,0.25f);

        Vector3pos2 = Vector3.Lerp(beginpos, endpos, 0.5f);

        Vector3pos3 = Vector3.Lerp(beginpos, endpos,0.75f);

        Vector3[]posarray = new Vector3[]{ beginpos, pos1, pos2, pos3, endpos };//划分成5个角度实现缓动

        Vector3targetpos = posarray[0];

        for(int i = 0; i < 5; i++)

        {

            RaycastHit hitinfo;//获取碰撞物体信息判读是否遮挡住人物

            if (Physics.Raycast(posarray[i],player.position - posarray[i], out hitinfo))

            {

                if (hitinfo.collider.tag != "Player")

                {

                    continue;

                }

                else

                {

                    targetpos =posarray[i];

                    break;

                }

            }

            else

            {

                targetpos =posarray[i];

                break;

            }

            this.transform.position = targetpos;

        }

    }

}

 using UnityEngine;

using System.Collections;

 

public class Followplayer : MonoBehaviour

{

    privateVector3 offset;

    privateTransform player;

    //Use this for initialization

    privatevoid Awake()

    {

        player = GameObject.FindGameObjectWithTag("Player").transform;

        offset =transform.position - player.position;//计算偏移

        offset = new Vector3(0,offset.y, offset.z);

    }

 

    voidStart()

    {

 

    }

 

    //Update is called once per frame

    voidUpdate()

    {

        Vector3beginpos = offset + player.position;

        Vector3endpos = player.position + offset.magnitude * Vector3.up;//offset.magnitude为计算长度得到垂直长度

        Vector3pos1 = Vector3.Lerp(beginpos, endpos,0.25f);

        Vector3pos2 = Vector3.Lerp(beginpos, endpos, 0.5f);

        Vector3pos3 = Vector3.Lerp(beginpos, endpos,0.75f);

        Vector3[]posarray = new Vector3[]{ beginpos, pos1, pos2, pos3, endpos };//划分成5个角度实现缓动

        Vector3targetpos = posarray[0];

        for(int i = 0; i < 5; i++)

        {

            RaycastHit hitinfo;//获取碰撞物体信息判读是否遮挡住人物

            if (Physics.Raycast(posarray[i],player.position - posarray[i], out hitinfo))

            {

                if (hitinfo.collider.tag != "Player")

                {

                    continue;

                }

                else

                {

                    targetpos =posarray[i];

                    break;

                }

            }

            else

            {

                targetpos =posarray[i];

                break;

            }

            this.transform.position = targetpos;

        }

    }

}

 


以及unet改版

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Followplayer : MonoBehaviour
{
    public float movespeed = 1;
    public float rotatespeed = 1;
    private Vector3 offset;
    public GameObject Player;
    private Transform playertransform;
    private GameObject[] players;
    private int i,pass=0;
    private bool isntrue=false;
    // Use this for initialization






    bool FindPlayer()
    {
        players = GameObject.FindGameObjectsWithTag("Player");
        foreach (GameObject one in players)
        {
           
            if (one.GetComponent<SoliderController>().islocal==true)
            {
                Player = one;
                Debug.Log("Find Player");
                return true;
            }
            else Debug.Log("false2"); 


        }
        return false;
    }
    void SetOffset()
    {
        playertransform = Player.transform;
        //player = GameObject.FindGameObjectWithTag("Player").transform;
        offset = transform.position - new Vector3(0,0,0);//计算偏移
        offset = new Vector3(0, offset.y, offset.z);
    }


    // Update is called once per frame
    void Update()
    {
        if (playertransform == null)
        {
            
            if (FindPlayer())
                SetOffset();
        }
        if (playertransform == null)
        {
            return;
            Debug.Log("false");
        }
        Vector3 beginpos = offset + playertransform.position;
        Vector3 endpos = playertransform.position + offset.magnitude * Vector3.up;//offset.magnitude为计算长度得到垂直长度
        Vector3 pos1 = Vector3.Lerp(beginpos, endpos, 0.25f);
        Vector3 pos2 = Vector3.Lerp(beginpos, endpos, 0.5f);
        Vector3 pos3 = Vector3.Lerp(beginpos, endpos, 0.75f);
        Vector3[] posarray = new Vector3[] { beginpos, pos1, pos2, pos3, endpos };
        Vector3 targetpos = posarray[0];
        for ( i = 0; i < 5; i++)
        {
            RaycastHit hitinfo;
            if (Physics.Raycast(posarray[i], playertransform.position - posarray[i], out hitinfo))
            {
                if (hitinfo.collider.tag != "Player")
                {
                    continue;
                }
                else
                {
                    targetpos = posarray[i];
                    break;
                }
            }
            else
            {
                targetpos = posarray[i];
                //if (i > 0 && i != pass) isntrue = true;
                break;
            }
        }
        transform.position = beginpos;    
       // transform.position = Vector3.Lerp(transform.position,targetpos,Time.deltaTime*movespeed);//插值运算实现相机缓动
        //Quaternion nowquaterniom = transform.rotation;
        //transform.LookAt(playertransform);
        //if(isntrue)
        //{
        //   i= Computer(i);
        //    Debug.Log(i);
        //    transform.Rotate(22.5f * i, 0, 0);
        //}


        //transform.rotation= Quaternion.Lerp(nowquaterniom, transform.rotation, Time.deltaTime * rotatespeed);


    }


    //int Computer(int i)
    //{
    //   int b = i - pass;
    //    pass = i;
    //    return b;
    //}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值