沙漠坦克大战知识梳理

213 阅读1分钟

1.实现两个坦克之间的视野随距离的变化而变化


```csharp
 public Transform Role;
    public Transform Enemy;
    public Camera MainCamera;
    float Distance;
    Vector3 offet;//偏移量
    float propertion;//相机的orthographicSize与主角和敌人的距离之比
    void Start()
    {       
        offet = transform.position - (Role.position + Enemy.position)/2;
        Distance = Vector3.Distance( Role.position , Enemy.position);
        propertion = MainCamera.orthographicSize/ Vector3.Distance(Role.position, Enemy.position);
    }

    void Update()
    {
        Distance = Vector3.Distance(Role.position, Enemy.position);
        transform.position = offet + (Role.position + Enemy.position)/2;

        MainCamera.orthographicSize = propertion * Distance;
        if (MainCamera.orthographicSize < 7)//当距离很近时保持最小比例
        {
            MainCamera.orthographicSize = 7;

        }
}

2.实现敌人的炮口动态的指向主角

(1)当主角在敌人右前方,需要旋转到的角度为:Acose(z/distance)+0 在这里插入图片描述 (2)当主角在敌人左前方,需要旋转到的角度为:-1*Acose(z/distance)+0 在这里插入图片描述 (3)当主角在敌人左后方,需要旋转到的角度为:Acose(z/distance)+180

在这里插入图片描述 (4)同理,当主角在敌人右后方,需要旋转到的角度为:-Acose(z/distance)+180 在这里插入图片描述 注意这里的左右由于朝向的问题,是一个实时变化的,量对应到代码里到代码里为两坐标的正负。

对应代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Enemy : MonoBehaviour
{
    public float Hp = 100;
    public Rigidbody ri;
    float Rotaspeed;
    float speed;
    public GameObject bullet;
    public Transform bulletposition;
    public Slider HPcahnge;
    private float Distance;
    public Transform Player;

    // Start is called before the first frame update
    void Start()
    {
        Hp = 100;
        Rotaspeed = 5f;
        speed = 6f;
        ri.GetComponent<Rigidbody>();
    }


    void Update()
    {
        Rota();
        Move();

    }

    void Move()
    {
        ri.velocity = transform.forward * speed; 
    }
    







void Rota()
{
    float isbackUpAngle = 180f;
    float isbackUp = 1;
    Distance = Vector3.Distance(transform.position, Player.position);
    Vector3 Direction = transform.position - Player.position;
    //Mathf.Abs取绝对值 Mathf.Acos反余弦   Mathf.Rad2Deg 1弧度的度数
    float radis = Mathf.Acos(Mathf.Abs(Player.position.z - transform.position.z) / Distance) * Mathf.Rad2Deg;


    if (transform.position.z - Player.position.z < 0)//主角在敌人的后面
    {
        isbackUpAngle = 0;
        isbackUp = -1;
    }

    if (transform.position.x - Player.position.x < 0)
    {
        transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0, isbackUp * (-radis + isbackUpAngle), 0), Rotaspeed * Time.deltaTime);
    }
    else
    {
        transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0, isbackUp * (radis + isbackUpAngle), 0), Rotaspeed * Time.deltaTime);
    }
}

   

}