Perl日記

PerlとかRubyとかPHPとかPythonとか

Unity FPS 視点メモ

プレイヤオブジェクト - 視点(空オブジェクト) - カメラ の親子関係

プレイヤオブジェクトにて、WASD で前進と左右移動と、マウスの左右移動でカメラの左右回転をする。
視点にて、マウスの上下移動でカメラの上下回転をする。

using UnityEngine;

public class PlayerTest : MonoBehaviour
{
    private float moveSpeed = 0.01f;

    void Update()
    {
        transform.position += transform.TransformDirection(Vector3.forward) * Input.GetAxis("Vertical") * moveSpeed;
        transform.position += transform.TransformDirection(Vector3.right) * Input.GetAxis("Horizontal") * moveSpeed;

        float x = Input.GetAxis("Mouse X");
        if (x != 0)
        {
            transform.Rotate(0, x * 6.0f, 0);
        }
    }
}
using UnityEngine;

public class PointOfViewTest : MonoBehaviour
{
    Camera cam;

    void Start()
    {
        cam = Camera.main;
        cam.transform.position = transform.position;
        cam.transform.rotation = transform.rotation;
        cam.transform.parent = transform;
    }

    void Update()
    {
        float y = Input.GetAxis("Mouse Y");
        if (y != 0)
        {
            cam.transform.Rotate(-y * 3.0f, 0, 0);
        }
    }
}

MLAPI その11

カメラを追従するようにする。

public class PlayerCubeController : MLAPI.NetworkedBehaviour
{
    private Vector3 offsetPosition;

    private void Start()
    {

        if (IsOwner)
        {
            offsetPosition = transform.position - Camera.main.transform.position;
        }
    }

    private void Update()
    {
        if (!IsOwner)
        {
            return;
        }


        Camera.main.transform.position = transform.position - offsetPosition;
    }
}

MLAPI その10

なんとなくわかってきた。昨日のやつで配慮できてなかったところをやる。


全弾がアクティブだったときに、更にスペースキーを押すと null が返ってきてしまうので、if で囲う。

public class PlayerCubeController : MLAPI.NetworkedBehaviour
{
    [MLAPI.Messaging.ServerRPC]
    private void Shoot()
    {
        GameObject bullet = spawnManager.GetFromPool(new Vector3(Random.Range(-9, 9), 1.0f, Random.Range(-9, 9)), Quaternion.Euler(0, 0, 90));
        if (bullet != null)
        {
            bullet.GetComponent<MLAPI.NetworkedObject>().Spawn();
            StartCoroutine(BackToPool(bullet, 2.0f));
        }
    }
}

Bullet の方で衝突時に自発的に消えてしまう部分をコメントアウト
弾が衝突したときの影響がオブジェクトプールから取り出したあともまだ残っているので、ゼロにしたうえで戻す。
あと AddForce じゃなくて velocity に直接入れる形にしてみた。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour
{
    private float speed = 5;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        rb.velocity = transform.up * speed;
    }

    void OnCollisionEnter(Collision other)
    {
        //Destroy(this.gameObject);
    }

    private void OnDisable()
    {
        if (rb)
        {
            rb.velocity = Vector3.zero;
            rb.angularVelocity = Vector3.zero;
        }
    }
}

なんとなく形にはなったけど、とりあえず練習という感じで、もう少しやりたい方向に近づけるようにしたい。