1.通过向量和四元数控制子弹发射
子弹类
public class bullet : MonoBehaviour
{
public float speed;
void Start()
{
Destroy(gameObject,3);
}
void Update()
{
this.transform.Translate(Vector3.forward * Time.deltaTime * speed);
}
}
Vector3.forward使用的是常量,不出错。
发射控制
enum E_BulletType
{
One,
Two,
Three,
Round
}
public class shoot : MonoBehaviour
{
public GameObject bullet;
private E_BulletType btype = E_BulletType.One;
public int num = 4;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha1))
{
btype=E_BulletType.One;
}
else if (Input.GetKeyDown(KeyCode.Alpha2))
{
btype = E_BulletType.Two;
}
else if (Input.GetKeyDown(KeyCode.Alpha3))
{
btype = E_BulletType.Three;
}
else if (Input.GetKeyDown(KeyCode.Alpha4))
{
btype = E_BulletType.Round;
}
if (Input.GetKeyDown("a"))
{
switch (btype)
{
case E_BulletType.One:
GameObject.Instantiate(bullet, this.transform.position, this.transform.rotation);
break;
case E_BulletType.Two:
GameObject.Instantiate(bullet, this.transform.position + this.transform.right*0.5f, this.transform.rotation);
GameObject.Instantiate(bullet, this.transform.position - this.transform.right * 0.5f, this.transform.rotation);
break;
case E_BulletType.Three:
GameObject.Instantiate(bullet, this.transform.position, this.transform.rotation*(Quaternion.AngleAxis(20,Vector3.up)));
GameObject.Instantiate(bullet, this.transform.position, this.transform.rotation * (Quaternion.AngleAxis(-20, Vector3.up)));
GameObject.Instantiate(bullet, this.transform.position, this.transform.rotation);
break;
case E_BulletType.Round:
float angle = 360 / num;
for (int i = 0; i <num; i++)
{
GameObject.Instantiate(bullet, this.transform.position, this.transform.rotation*Quaternion.AngleAxis(i*angle,Vector3.up));
}
break;
}
}
}
}
要用Quaternion.AngleAxis(20,Vector3.up) ,也有Quaternion.AxisAngle 老方法(不使用)。
2.摄像机跟随效果
cs
//目标对象
public Transform target;
//相对头顶的偏移位置
public float headOffsetH = 1;
//倾斜角度
public float angle = 45;
//默认的 摄像机离观测点的距离
public float dis = 5;
//距离必须是3和10之间
public float minDis = 3;
public float maxDis = 10;
//鼠标中间滚动控制的移动速度
public float roundSpeed = 1;
//看向对象时 四元数 旋转的速度
public float lookAtSpeed = 2;
//跟随对象移动的 速度
public float moveSpeed = 2;
//当前摄像机应该在的位置
Vector3 nowPos;
private Vector3 nowDir;
//实现了鼠标中键 滚动 来改变摄像机远近
dis += Input.GetAxis("Mouse ScrollWheel")*roundSpeed;
dis = Mathf.Clamp(dis, minDis, maxDis);
//向头顶偏移位置
nowPos = target.position + target.up * headOffsetH;
//往后方偏移位置
nowDir = Quaternion.AngleAxis(angle, target.right) * -target.forward;
nowPos = nowPos + nowDir * dis;
//直接把算出来的位置 进行赋值
//this.transform.position = nowPos;
this.transform.position = Vector3.Lerp(this.transform.position, nowPos, Time.deltaTime* moveSpeed);
Debug.DrawLine(this.transform.position, target.position + target.up * headOffsetH);
//这里是 通过插值运算 来缓动 看向 物体
this.transform.rotation = Quaternion.Slerp(this.transform.rotation, Quaternion.LookRotation(-nowDir), Time.deltaTime* lookAtSpeed);