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